点击蓝字,关注我们
日期: 2023-09-19 作者: Mr-hello 介绍: 之前做pwn练习时记录的几个题目的笔记。
0x00 前言
翻了好久,才发现自己之前学习过一段时间的 pwnable
题目练习,趁着书写本次公众号文章,重新整理并复习了一下上面的几道题目。
0x01 coin1
知识点
socket编程 && 二分查找法
打开题目如下图所示。
分析题目意思,每次游戏会给出两个数N
、C
分别代表硬币总个数、验证机会。在给出的N
个硬币中存在一枚假币。只有通过称重的方式进行检验,真硬币重量为10
,假硬币重量为9
。一次可以称重的硬币数量不限,在到达验证次数之前给出假硬币编号即可算为一次过关。需要在一分钟之内进行一百次游戏。即可获取flag
。由于时间太短,所以需要网络编程进行解决。算法使用二分查找法。
import socket, sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('127.0.0.1', 9007)
sock.connect(address)
print sock.recv(2048)
for i in range(100):
recv = sock.recv(100)
N = int(recv.strip().split(' ')[0].split('=')[1])
C = int(recv.strip().split(' ')[1].split('=')[1])
low = 0
high = N
for j in range(C+1):
mid = int((low+high) / 2)
li = [str(k) for k in range(low, mid+1)]
buf = " ".join(li)
sock.send(buf + 'n')
coins = mid - low + 1 #number of sent coin
recv = sock.recv(100)
if recv[:8] == 'Correct!':
print recv
break
weight = int(recv)
if coins * 10 == weight:
low = mid + 1
else:
high = mid
recv = sock.recv(1024)
print recv
0x02 random
知识点
rand() 函数随机数种子
连上ssh,cat random.c
文件,拿到源程序,在本地编译测试。发现代码没加随机种子,所以随机值根本不会改变,直接进入gdb
看随机值。
也就是说rand()
函数每次生成的数值不会随机,只需要对得到的数值进行异或。
接下来就是在服务器上测试,输入3039230856
。
0x03 passcode
知识点
got表函数覆写
使用GDB
动态调试时发现在调用welcome
函数和login
函数时ebp
地址一样。
这样就可以导致栈溢出。在welcome
函数中输入的v1
变量长度可以达到100
。地址为ebp-70h
。在login
函数中passcode1
地址为ebp-10h
。两者相差0x70h - 0x10h
即96
位,v1
变量长度100
,也即最后四位可以覆盖掉passcode1
。本题溢出点是由scanf
函数未加&
导致的。输入scanf(“%d”,&passcode)
时读取的是passcode
的地址0x70707070
,当输入scanf(“%d”,passcode)
时读取的是passcode
这个地址的存储内容即0x80808080
,如果我们可以控制0x80808080
这个内容,那我们就可以利用这个漏洞进行GOT
表的覆写。刚好在输入name
变量时可以对该处进行覆盖。我们可以覆写掉fflush
函数。fflush
函数地址为0x0804A010
。
即我们输入的最后四位应该是x10xA0x04x08
。这样我们就将scanf()
函数处的初始内容改为了x10xA0x04x08
,然后这一步我们只是将覆写函数的地址传了进去,我们还要通过passcode1
来将函数内容写进去,在输入passcode1
的时候,通过scanf()
函数取出的便成为fflush
函数的地址,然后我们的输入就覆盖掉了fflush
函数地址上的内容。这里我们已经有了system
函数,我们直接将system
函数内容写入即可。system
函数传了参数bin/cat flag
,所以我们需要从传参数的那个地址写过来。即0x0804862D
,并且由于自接受passcode1
时需要以int
类型输入,即将0x0804862D
转换为134514221
输入。
payload:python -c print"'a'*96 + 'x10xa0x04x08'+ 'n' + '134514221n'" | ./passcode
0x04 结尾
这些内容是我刚接触逆向时学习留下的一些笔记,后面在写文章时苦于不知道写什么内容,于是就翻了出来,大体看了一看,发现有部分笔记记得很模糊,所以趁着这次写文章,又去记录了一遍,也发现了一些新东西,也算是整理一下自己的记忆了。
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
点此亲启
原文始发于微信公众号(宸极实验室):『CTF』pwnable 学习笔记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论