[CTF pwn]傻傻分不清的execveint80syscallsystem及shellcode

Posted 漫小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CTF pwn]傻傻分不清的execveint80syscallsystem及shellcode相关的知识,希望对你有一定的参考价值。

1、execve形式的shellcode

64位系统中,不再使用int 0x80来进行系统调用,取而代之的是syscall指令

1.1 32位参数传递和shellcode

%eaxSystem call%ebx%ecx%edx%esi%edi%ebp
11/0x0bexecveconst char *filenameconst char *const argvconst 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

%raxSystem call%rdi%rsi%rdx%r10%r8%r9
59/0x3bexecveconst char *filenameconst char *const argvconst 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

谈一谈让人傻傻分不清的1G,2G,3G,4G……

cacao与cocoa 傻傻分不清的“可可”

CAPL脚本中关于相对路径/绝对路径操作的几个傻傻分不清的内置函数

鉴权和授权,傻傻分不清

URI、URL傻傻分不清