首页
社区
课程
招聘
[原创]8月29号网鼎杯pwn1-impossible简单调试过程
发表于: 2018-8-31 20:22 18100

[原创]8月29号网鼎杯pwn1-impossible简单调试过程

2018-8-31 20:22
18100


发现开了canary和nx(栈上不可执行)

canary:(函数返回时会检测这个值,如果改变,就会崩溃,可以防止shellcode覆盖返回地址)

nx:防止栈上执行代码

RELRO(表示重定位表只读)

     这里大家多看一下程序,运行一下,就可以知道逻辑了,这个是main函数主体:


简单的意思输入不同的数字,会进入不同的流程

当输入9011时,会进入sub_4008A3这个函数


这里存在栈溢出,因为buf的长度为16个字节,拷贝的长度为0x1000,所以会存在栈溢出,所以当时想到的解题思路就是进入这个分支,栈溢出,覆盖返回地址,直接进入调用system(“/bin/sh”)拿到shell,读取flag(后来由于程序本身的原因是走不通的)。

        继续看,如果进入这个if分支,需要输入的数值和读到的数值一样才行。

fd = open("/dev/urandom", 0); 这个是读取随机数,每次读取的值不一样,然后和我们输入的数值相比较,因为每次都随机,无法预测到随机数,这样永远都猜不到读取到的随机数值,也无法进入if大括号内,无法触发执行qmemcpy触发栈溢出。方法是:这里需要打开1024次,然后再次打开这个设备文件会出错,返回错误,读进去的unk_602068数组也全为0,然后我们输入8个0,判断相等,就可以进入if分支内了。


       再看unk_602080这个全局变量,最后需要布置好数据,而且需要绕过canary,才能覆盖返回地址,那么如何知道canary值呢?

这里提醒一下,每次程序运行的时候canary的值是不一样的,而且,一个程序运行时候所有的canary值都是一样的值。

我们回到主程序:

当输入数值2的时候,会进入这个函数:


会从键盘输入的字符拷贝到这个全局变量中。


当输入1的时候:


       函数的意思是会将输入的字符串拷贝到栈中的buf中,然后输出,这里只能执行一次函数read,puts,不能执行第二次,从这里我们通过利用这个函数可以打印出canary值,直接上gdb调试,进入这个函数。

在0x40a22下断点:输入1,会进入这个函数:


看到canary值,0x4dc9d7e 0x8b445b00,存放在rbp-8的位置,而buf的位置为rpb-0x110,只要puts出0x110-8位置的8个值,就是canary值,前面的buf直接填充可见字符,但是8位的canary值,最低地址为0,会被截断,所以也需要覆盖最低位为0x00替换为可见字符,直接打印后面的7个字符,就可以算出canary值了

     下图为没有读取字符时的buf


通过生成0x110-8 -1个可见字符,这样会打印后面的7位的canary,这里啰嗦一下。


下一步会调用puts进行打印所有可见字符



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-8-31 20:48 被LowRebSwrd编辑 ,原因: 拼写错误
上传的附件:
  • 1.py (1.49kb,94次下载)
  • pwn (9.91kb,47次下载)
收藏
免费 2
支持
分享
最新回复 (25)
雪    币: 2247
活跃值: (354)
能力值: ( LV13,RANK:275 )
在线值:
发帖
回帖
粉丝
2
前排赞一个
2018-8-31 20:46
0
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
3
楼主厉害了
2018-8-31 21:09
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
版主厉害了,666
2018-8-31 21:21
0
雪    币: 1
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主的实力那么强,容我好好消化一下......
2018-8-31 21:50
0
雪    币: 4
活跃值: (170)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
正好学习学习,期待剩下的pwn题呀
2018-9-1 00:33
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
太强了吧,1024次打开会出错
2018-9-1 00:51
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不明觉厉
2018-9-1 05:53
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
2018-9-1 09:34
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好叼
2018-9-1 09:42
0
雪    币: 251
活跃值: (503)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
厉害了老师
2018-9-1 12:17
0
雪    币: 164
活跃值: (236)
能力值: ( LV12,RANK:583 )
在线值:
发帖
回帖
粉丝
12
厉害,我刚还看了下,默认文件句柄上限还真是1024。学到了
2018-9-1 13:29
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
13
所以请问1024次操作如何让服务器不timeout?这个一分钟的时限真的恶心
2018-9-1 17:40
0
雪    币: 6573
活跃值: (3888)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
14
holing 所以请问1024次操作如何让服务器不timeout?这个一分钟的时限真的恶心
多少次会timeout呢,应该跟网络延迟有关吧
2018-9-1 18:17
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
厉害了,我的哥
2018-9-1 18:19
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
16
LowRebSwrd 多少次会timeout呢,应该跟网络延迟有关吧
我当时200多次就timeout了,迷了。。。延迟50-60,不算高吧。。。
2018-9-1 19:09
0
雪    币: 8277
活跃值: (642)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
17
学长厉害,学习了。
2018-9-1 21:14
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
常总
2018-9-2 08:42
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
厉害厉害
2018-9-2 08:43
0
雪    币: 260
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
666,学习了
2018-9-2 18:42
0
雪    币: 916
活跃值: (3434)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
21
常总
2018-9-3 11:39
0
雪    币: 10868
活跃值: (3282)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
22
研究了一下 实在无法SHELL 只能读文件,充其量还可以写文件
2018-9-3 21:58
0
雪    币: 279
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
感谢楼主!
2018-9-4 18:55
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
学习了,感谢楼主
2018-9-18 11:07
0
雪    币: 14
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
2018-10-16 20:31
0
游客
登录 | 注册 方可回帖
返回
//