首页
社区
课程
招聘
[原创] pwnable.kr 刷题日记 2 - someof
发表于: 2017-12-16 23:07 13270

[原创] pwnable.kr 刷题日记 2 - someof

aqs 活跃值
5
2017-12-16 23:07
13270

运行效果

输入一个控制台参数,长度为 20
ida 打开看看,

一个check_password 函数对 argv[1] 进行操作,返回值和 0x21DD09EC比较
相同直接cat flag

checkpassword 主要如下

loc_80484C2 开始进行5次循环
每次循环取 argv[1][index<<2] 进行相加
那么就是将输入的 argv[1] 分成五份,相加结果 == hashcode 即可
exp

运行效果

32 位的程序,relro partial 其他全开
ida 打开如下

基本思路是:
程序直接使用gets, 可以无限输入,所以有溢出
后面判断 函数的第一个参数是否是0xCAFEBABE,是的话直接给shell,好吧
那将 第一个参数覆盖成 0xCAFEBABE 即可
exp

可以看到有 upx 的壳

upx 脱一下壳

strings 直接出来,,

rand() 伪随机,直接gdb 调试找到这个数字 异或一下0xDEADBEEF即可

32 位的程序,没有开pie,

输入一段数据之后程序会给出一个hash 字符

可以看到逻辑很简单
输入最长为30长度的字符-> 将字符base64decode-> decode之后长度不能超过0xc-> 进行一个auth 判断,过了直接给shell,简单粗暴

那么主要就看 auth 搞什么了

将 base64decode 之后的字符放到 v4, 计算一下md5,输出来,如果是
f87cd601aa7fedca99018a8be88eda34 的话就给一个shell.
f87cd601aa7fedca99018a8be88eda34 破解不了,但是这里因为 v4 长度只有 0x8,而input 有 0xc 长度,memcpy 的时候有溢出
嘛,这样就好办了,有溢出就可以搞事情,但是这里只能覆盖4个字节
也就是到ebp 的位置

所以要做的就是
劫持 ebp --> 劫持 esp --> 然后 rop getshell了
因为input在bss段上,存放最后deecode之后的内容,所以直接劫持 ebp到 input 位置即可

auth 函数 leave ret 之后 ebp 就变成了 input 的地址

main 函数 leave 之后 esp 变成了 input+4 的位置, 填入 system 地址即可

exp

cmd的部分有点是linux的使用的熟练度的问题了,嘛,记录一下

程序如下

嘛,设置了 path, 然后直接调用 system(argv[1]),对于 argv[1] 的输入有一个fillter, 就是怎么绕过拿flag的了

这里很简单,不能有 flag sh tmp 等,一个通配符过之

cmd2 和cmd1 类似,不过加强了一下 fillter

flag 直接用通配符读即可,但是就是 路径的 / 不好搞
这里可以使用 ${PWD} 来代替, 进入 / 目录, 这样 ${PWD} 就是 /
然后直接cat flag 即可

uaf 64 位的程序,有三个选项

只能输入 1,2,3 不能怎么搞的样子,还一言不合就 segment fault
ida 打开看看代码
主要逻辑如下

这里使用的是 c++ 的类,一开始先创建 man 和woman两个对象
1 use 这里有三个类,Man,Woman 继承 Human,Human 实现了 introduce 和 getshell 两个函数,Man Woman 重写了 introduce函数,这样运行时候就因多态而进行对应函数的调用
2 after 需要传入两个控制台参数,类似 ./uaf 24 ./file
打开 argv[2], 读取 argv[1] 个byte到一个 chunk 里面

3 free 首先delete human 然后delete woman

嘛,大概就是这样,因为题目是 uaf,所以应该是利用 uaf 来搞事情
uaf 主要就是 有指针分配内存之后没有置 0, 这样就还可以访问原来的那个指针对应的 chunk区域
I can use it although after I free it 的意思大概

先调试看看

上面是 woman 的堆的对应的区域
其中 0x614ca0 保存了其对应的函数调用地址

Man 的组织形式也是类似,既然有指针,那就可以搞事情是吧,我把0x614ca0
保存的地址改一下,让 Man 或者Woman 调用 introduce 的时候去调用getshell 函数,然后use 一下就可以 getshell了

okay, 可以写的就只有 after 这个选项,具体的利用思路就是

1 free 一下,这样就有两个 0x18 大小的chunk,这时候对象的指针没有清空,仍可以访问,但是 函数指针变了,所以调用 use的时候会segment fault

2 after 一下,需要先控制台传入 ./uaf 24 /tmp/somefile,0x18-24,这样就可以将 after
的chunk分配到刚才 Woman 或Man 的位置,因为是Man 先delete的,根据fastbin 的规则
after 会先分配在 Woman原来的位置,这样我们想 /tmp/semefile 里写入什么就可以怎么改chunk,将指针 改为原先的位置-0x8 即可

3 因为 use 是先调用 Man,所以真正需要写的是 Man 原先的chunk, after 两次即可

具体操作如下

 
 
 
 
 

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

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 62
活跃值: (971)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
分析很到位
2017-12-18 10:13
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错!
2017-12-19 23:13
0
雪    币: 16
活跃值: (10)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
大佬,rootkit的那道题目你做了吗?我打开了flag文件,但是为什么是乱码呢?能交流吗?
2019-4-18 09:53
0
游客
登录 | 注册 方可回帖
返回
//