运行效果
输入一个控制台参数,长度为 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直播授课