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