博文

ASIS-2017-PWN-Start-Record

1. 检查安全性 pwn checksec {file}     没有 canary 和 NX 爽的飞起 2. 确定溢出位置     gdb 调试环境影响 buf 在内存的位置, 所以要根据 core dump 来看buf地址。 ulimit -c unlimited sudo sh -c 'echo "/tmp/core.%t" > /proc/sys/kernel/core_pattern' pwn cyclic -n 8 200 gdb {file} core # -> crash_addr pwn cyclic -n 8 -l {crash_addr} # -> x:('a' * x + {ret_addr}) 3. pwntools 脚本走起     直接栈上 shellcode 居然跪了,显然服务器端开启了ASLR 4. Bypass ASLR     * 程序没有调用 system 函数, 没法使用 system_plt 来调用真实地址     * 程序没有用 write 函数不知道该怎么把 base addr 泄露回来 5. Read writeup          http://look3little.blogspot.com/2017/04/writeupasis2017-start-89-pwn-warmup.html     * bss 地址是固定的     * bss 区是可执行的       所以思路就是把shellcode写到bss中, 然后rop执行之。       获取 bss 地址的方法:       * objdump -h {file}     * pwntools: elf.bss() 6. ROP     x64 寄存器传参, RDI,RSI, RDX, RCX, ...       ROPGadget 寻找 控制 RDI, RSI 及 RDX,对应 read 的三个参数。       如果没有则可以考虑“universal gaget”, 但在本题中,RDI 和 RDX的值刚好合适, 只需填RSI即可, ROPGadget 可以找到 RSI 相关的 gadget: pop