[OGeek2019]babyrop 1
这题的知识点是一个ret2libc3和一个绕过随机数
1)checksec一下看一下保护
好的
2)丢尽ida看一下
1、首先是搞懂main函数
fd就是一个打开生成随机数文件
read函数将生成的随机数放到buf
然后进入第一个sub_804871F
2.瞧一瞧sub_804871F
1、memset的作用完成数组初始化,全部为0
2、sprintf的作用
原型
int sprintf( char *buffer, const char *format, [ argument] … );
主要作用是主要功能是把格式化的数据写入某个字符串中
参数列表
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据
这样看不直观,给一个举个例子:
例子:int x=42;
char str[256];
sprintf_s(str, 256, "%d", x);
3、strncmp
a、头文件<string.h>
b、C 库函数 int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。
- str1 -- 要进行比较的第一个字符串。
- str2 -- 要进行比较的第二个字符串。
- n -- 要比较的最大字符数。
c、返回值
该函数返回值如下:
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str2 小于 str1。
- 如果返回值 = 0,则表示 str1 等于 str2。
4、这个函数的大致作用
用户输入一个数字然后和随机数(实参buf,这里是形参a1)比较大小,如果大了,则会exit(0)退出
最后返回的是buf【7】
我们为了避免比较可以做一点手脚,字符串的会被0x00截断,我们可以看到比较字符的个数(v1)是根具strlen(buf)来的,而buf是我们输入的。所以我们可以让其先被0x00截断,使得strlen结果为0.剩余位置更具接下来的要求覆盖。
payload = b'0x00'+ b'0xff'*7
0xff是我们需要根据下一个函数推出来的
3、看一看sub_80487D0函数
我们发现a1(buf[7]、v2)的大小决定着我们能不能栈溢出(不等于127而且尽量大一点),我们可以考虑将其覆盖为0xff,这也就是上面(oxff)的由来
3)整体思路
通过上面的思路,在buf的输入构思一下,0x00+0xff*7
由于这道题的libc版本给了,所以我们泄露一个函数(我选择write)真实地址就可以计算偏移了。我们可以练习一下ret2libc3.
4)我的wp
由于我打不开题目的链接emmmm我就用LibcSearcher打了