比赛之前看到给了一个linux 的版本号
被吓到了,我靠,这不会是 kernel 题目吧,赶紧编了个一样版本的linux image
比赛开始后。。。
好吧,是我想多了
checksec 看一下
64 位的程序,没有 开 PIE, relro partial
运行一下看看效果
出题人还来了一首诗,不过没有什么用, 可以输入一个字符串,输入完就报错了
一般报错都是segment fault 什么的, 这里确实 illegal hardware ??
换了一下输入
报错信息变了,测试之后发现只能输入 6个byte 的字符,这样也看不出什么
ida 打开看看代码
main函数
main 函数 前面主要进行 setbuf 一些初始化的操作
调一个 welcome 函数打印那首诗,然后直接jump 到内存地址 0x400818
不过没有看到有可以输入的地方呀。。应该是和 jump 过去的地址有关
welcome 函数里面还有一个 ptrace 的系统调用, 主要用来反调试的
gdb 打开 , 直接 exit 退出了
将 __asm { syscall; LINUX - sys_ptrace } 这段 nop 掉即可
接下来到 0x400818 看看程序究竟干了什么
看到只有几个是可见字符的,试了一下 e, 结果居然真是 e..
先在 0x000000000040087d 下个断点, run 一下, 输入 e
这里是判断是否要跳出循环的地方, c 运行几次, 0x40087f 的地方的指令就会被还原
删除原来的断点, 然后再 0x40087f 下个断点,就可以调到解码后的代码的位置了
gdb dump 一下内存, 然后就可以用 ida 打开查看,dump 指令如下
将代码段的内容 dump 到 unz1 文件里面
ida 用 binary 格式打开, rebase 一下 segment 基地址到 0x400000, 跳到 0x40087f 按一下 c 转换成 代码
具体
okay 看一下加密之后的代码, 这里先 进行 0x20 次循环, 将 0x4008c9 代码开始 一个byte 一个 byte 和 input[0] 进行异或,这个是我们不能控制的,继续看下面
下面 的 操作
dl = input[1]^input[0],后面还是和第一次解码一样同样的比较条件
好吧,再写个脚本试试
找到个 v, 感觉应该是可以直接计算偏移然后将整个程序解码出来的,但是因为这里只有 6 个 byte 的字符
自己用的是 gdb dump 内存, 然后查看对应的指令这样的做法
最后解出来的 input 是 evXnaK, 运行一下程序,输入key, 就会输出一个 wow, 还有一个不明字符
可能是地址泄露了
看一下最后解码出来的代码, 代码有点长 总的来说就是
前面基本上都可以说是在逆向,后面就是 pwn 的内容了,主要漏洞点在
printf 的时候直接打印了字符串,有格式化漏洞
然后 后面 read 函数 可以读 0x100 长度的 字符造成一个 stack overflow
okay 找到了一个 格式化和栈溢出,因为程序开了 canary, 又没有给libc,所以攻击的思路是
执行效果
题目还是不错的,逆向渣渣的我学到了不少知识 :)
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
***************************
2018 kanxue CTF
***************************
***************************
常记溪亭日暮,沉醉不知归路。
兴尽晚回舟,误入藕花深处。
争渡,争渡,惊起一滩鸥鹭。
--宋 李清照
***************************
1
[1] 111733 illegal hardware instruction (core dumped) ./wow
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-7-4 09:36
被aqs编辑
,原因: