ctf pwn 刷题记录 buuctf

[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打了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值