stackoverflow之ret2libc
ret2libc
ret2libc,基本ROP之一,控制程序执行libc中的函数。
通常是返回至某个函数的plt处或者函数的具体位置(即函数对应的got表项的内容)。
一般是执行system('/bin/sh')
,故需要知道system
函数的地址。
binary1
32位binary,开启NX保护机制,ret2shellcode不可行。动态编译,ret2syscall不可行。
1、IDA
溢出空间=0x64+4+4+4=112,同时binary调用过system
函数,存在system
函数的plt表项。
同时binary存在/bin/sh
字符串。
2、ROP gadgets
/bin/sh:
1 | ROPgadget --binary ret2libc1 --string '/bin/sh' |
system@plt:
1 | objdump -d -j .plt ret2libc1 | grep 'system' |
3、pwn
4、exploit
1 | from pwn import * |
binary2
32位binary,开启NX保护机制,ret2shellcode不可行。动态编译,ret2syscall不可行。
1、IDA
溢出空间=0x64+4+4+4,binary调用过system
函数,存在system
函数的plt表项,但没有字符串/bin/sh
。
尽管没有/bin/sh
,但binary中调用了gets
函数,如此,字符串/bin/sh
可以通过gets
函数输入。
那么,接下来需要解决的问题就是,字符串/bin/sh
通过gets
函数输入到哪里进行存储?
一个明显的存储点,就是s即[ebp-64h]位置,然而在溢出位置输入字符串,然后再劫持回来执行system
函数,会覆盖数据。
另一个位置就是bss段:
buf2_bss_addr=binsh_addr=0x804a080
。
2、pwn
3、ROP gadgets
1 | ROPgadget --binary ret2libc2 --only 'pop|ret' |
4、exploit
1 | from pwn import * |
reference
github-ctf-wiki