[CTF pwn]傻傻分不清的execveint80syscallsystem及shellcode
Posted 漫小牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CTF pwn]傻傻分不清的execveint80syscallsystem及shellcode相关的知识,希望对你有一定的参考价值。
1、execve形式的shellcode
64位系统中,不再使用int 0x80来进行系统调用,取而代之的是syscall指令
1.1 32位参数传递和shellcode
%eax | System call | %ebx | %ecx | %edx | %esi | %edi | %ebp |
---|---|---|---|---|---|---|---|
11/0x0b | execve | const char *filename | const char *const argv | const char* const envp[] |
shellcode的参数和execve调用应为:
- eax = 0x0b
- ebx指向"/bin/sh"
- ecx = 0x0
- edx = 0x0
- execve("/bin/sh", 0, 0);
ROP chain拼成的shellcode的一个示例见下图,这里执行系统调用的最后一条汇编指令为int 80。
1.2 64位参数传递和shellcode
%rax | System call | %rdi | %rsi | %rdx | %r10 | %r8 | %r9 |
---|---|---|---|---|---|---|---|
59/0x3b | execve | const char *filename | const char *const argv | const char* const envp[] |
shellcode的参数和execve调用应为:
- rax = 0x3b
- rdi指向"/bin/sh"
- rsi = 0x0
- rdx = 0x0
- execve("/bin/sh", 0, 0);
ROP chain拼成的shellcode的一个示例见下图,这里执行系统调用的最后一条汇编指令为syscall。
2、system形式的shellcode
2.1 system与execve的区别
system是glibc中的函数,用shell来调用程序=fork+exec+waitpid,而exec是直接让你的程序代替用来的程序运行。
system 是在单独的进程中执行命令,完了还会回到你的程序中。而exec函数是直接在你的进程中执行新的程序,新的程序会把你的程序覆盖,除非调用出错,否则你再也回不到exec后面的代码,就是说你的程序就变成了exec调用的那个程序了。
看一下,下面的例子.
例子1
system("your_program");
printf("You can see me! ");
例子2
exec("your_program");
printf("You can't see me! ");
在例子1中,在你的程序执行完毕以后,会执行printf语句。
在例子2中,由于exec将程序your_program代替了本身,因此程序不再会执行printf语句。
2.2 system shellcode
以下两种形式均可:
1. system(“/bin/sh”)
2. system(“sh”)
第一种是使用/bin下的sh,第二种是通过环境变量找sh。
对于32位和64位,要遵循各自的调用约定,32位时摆在栈空间,64位时放在rdi寄存器。
以上是关于[CTF pwn]傻傻分不清的execveint80syscallsystem及shellcode的主要内容,如果未能解决你的问题,请参考以下文章
傻傻分不清的TCP keepalive和HTTP keepalive