0x0 程序保护和流程
保护:
流程:
main()
sub_40068E()
sub_40063D()
通过程序流程我们可以看出在sub_40068E()调用sub_40063D()时发生了栈溢出。
0x1 利用过程
1.这个程序没有system()函数,也没有"/bin/sh"。但是我们程序运行的时候需要libc。而libc中有我们需要的system(),所以我们只需要确定libc的基地址就可以知道system()。这里给出两种方法获取libc的基地址。第一种是pwntools自带的DynELF(leak,elf),但是这个只能寻找函数的地址不能寻找libc中的字符串。第二种是LibcSearcher模块。这里给出第一种方法
2.这个程序是x64它的传参模式跟x86不一样。x64是通过寄存器传参的。 x64中的前六个参数依次保存在RDI, RSI, RDX, RCX, R8和 R9中 。我们通过ROPgadget --binary 程序名 --only “pop|ret” 查找出二进制文件中的pop和ret指令的地址。
3.用DynELF时候没有"/bin/sh"。通过read/gets的方式读入。read函数有三个参数需要一个__libc_csu_init函数的通用gadget。gets函数直接用一个pop rdi ; ret就行了。
0x2 exp
DynELF
from pwn import *
elf=ELF('./a')
puts_plt=elf.plt['puts']
read_got=elf.got['read']
#context.log_level = 'debug'
pop_rdi=