adworld-pwn-新手区
tcl 到现在才算是正经昨晚攻防世界的pwn新手区,
整理wp:
题目文件:
https://www.jianguoyun.com/p/DSZC7xcQg9bmBxjp5eoC (访问密码:emFwst)
这其中利用到的相关漏洞:
格式化字符串、栈溢出、伪随机数覆盖种子、整数溢出
另外由于自己的exp设置好模板等, 基本都是一个比较大的框架里,每个exp都比较大, 而且会有不需要的部分,所以exp只是写出来关键的payload,前后的部分大都是套路,每次都在写的一样的东西,
文章目录
get-shell
其实这个是一般的pwn题目的常规套路,既,给一个二进制文件,分析其漏洞并写出exp, 再远程连接给出的端口,利用这个漏洞获取权限读取flag, 或直接读取flag,
这个题目就没有设置漏洞,这本身是一个获取shell的程序
点击获取远程场景,然后使用nc连接:
nc -nv host port
然后直接获取到了shell,则获取列表:
ls
然后看到flag,直接查看得到:
cat flag
CGfsb
先在linux下查看基础信息:
其中的语句:
NX: #堆栈不可执行--DEP
Canary: #栈保护
PIE: #内存地址随机化ASLR
然后扔到ida中查看伪代码,发现printf
的危险用法。
格式化字符串漏洞:
这类漏洞主要来源于printf一系列的可变参的库函数。
他无法区别自己的参数中由程序设定的部分和用户数据部分,所以当我们使用一些非规范的编码方式时会造成这个漏洞。
比如:
printf("%d%d%d")
我们不向print中传入数据,只要求输出格式,在运行时,print会输出数据,这是栈中的用户数据。
printf(&x)
当出现这种情况时,print会将一个数据打印出来,这是我们可以将这段数据写成输出格式,就可以使用printf输出一些地址信息、数据或其他一些敏感信息。而且
printf
中的格式语句%n
还可以改变程序内数值,我们本题目就利用到了这一点。此外还有
%x$n
的用法,x表示偏移,可以直接指向那个偏移位置对应的栈内空间
我们利用这个格式化字符串漏洞,返回栈内数据。
- 格式化字符串漏洞修改栈内数据
我们payload中,利用格式化中的``%x$n`,可以凭借此将pwnme修改。
注意这里多使用pwndbg调试, 要注意, %n格式是赋值到对应位置所指向的内存, 因此我们需要在栈中有一个只想pwnme的地址的指针,
我们使用写入名字的位置写入这个指向pwnme的指针,
然后在其后的格式化字符串位置修改pwnme,
但是要注意的是我们name写入的是中间位置, 而在栈中选取的时候只会选取到对齐的,我们应该前面补上四位, 然后对格式化字符串用%p,%p,%p,%p...
来确定下我们目标的偏移位置,
使用pwntools写exp修改pwnme的值:
name = b'aa' + p32(pwnme_addr)
payload = 'a'*8 + '%8$n'
when_did_you_born
我们发现最开始v5不能为1926,但是后面判定其为1926。
注意到v5的值前后矛盾。
如果是re题目,这样的判定后有应该是一个输出flag的函数,然后动态控制直接转向flag输出函数。
但pwn题目我们面对这样的情况会使用攻击手段修改掉这个参数,其中这个题目明显是栈溢出。
- 栈溢出覆盖特定位置字符
先计算v4v5之间的距离,由ebp-0x18
到ebp-0x20
为8位,我们得到payload并写出exp:
payload = "a" * 8 + p64(1926)
hello_pwn
ida载入发现这个题目和when_did_you_born
两个题目是一样的。
查看两个数据,发现在内存中相邻,所以本题和上上题是一样的。
计算距离为:4位。可以写出exp:
payload = 'a'*4 + p64(0x6E756161)
运行得到flag: