这题蛮有意思的,虽然叫 md5 calculator,但是跟md5算法没什么关系,主要考查的是伪随机。
1 | int my_hash() |
这题蛮有意思的,虽然叫 md5 calculator,但是跟md5算法没什么关系,主要考查的是伪随机。
1 | int my_hash() |
ssh lotto@pwnable.kr -p2222 (pw:guest)
这是一个游戏,猜对6个数就能拿到flag。
通过源码了解到这6个随机数是从/dev/urandom
中取出来的,而且范围在1~46之间,虽然 这是个伪随机,但是想要爆破难度还是挺大的。
题如其名,不过是c++的uaf漏洞,还好给了源码,不至于去IDA里面看那么丑的伪代码
程序中有后门give_shell
结构体中有函数指针,introduce
free
选项delete后没有清空指针存在UAF
after
选项中会new 一个新的空间,从文件中将内容读入
通过跟踪分析程序可知,存放着指针的堆块大小为0x20
蛮有意思的一题,格式化字符串,0x18个字节,2次机会,数据写在栈上;
很显然需要构造循环多次利用格式化字符串漏洞,第一次用来泄漏地址,第二次修改返回地址为main,回到printf处继续利用
1 | #include <stdio.h> |
有后门函数,且堆溢出
1 | # docker pull ubuntu:18.04 |
放到IDA很容易就找到溢出点
1 | char s; // [esp+0h] [ebp-28h] |
有一点值得引起注意,我们回车换行符同样会输入进去,明确溢出点以及可溢出的字节后接下来我们就开始构造rop,但在之前我们还应该检查一下程序开户了哪些保护,这决定了我们该采取何种rop攻击方式
exp 如下 :
1 | from pwn import * |
64位的溢出点也一样
exp:
1 | from pwn import * |
方法1:逆向破解,因为题目给了.c文件,里面有key和cipher可以直接用
1 | key = "Do_you_know_why_my_teammate_Orange_is_so_angry???" |
方法2:利用gdb动态调试,可以在已生成password且未输入magic的情况下获得password的值:
1 | 在0x80486e7处下断点,可以看到ebp - 0x80就是password存放的地方 |
方法3:
同样利用gdb调试,但是这次不用获取password的值而直接在if跳转前设置eip的值指向flag输出的for 循环即可