adworld攻防世界-pwn-新手区-wp

本文总结了adworld-pwn新手区的多种漏洞利用,包括格式化字符串漏洞、栈溢出、整数溢出等。通过分析题目提供的二进制文件,利用这些漏洞构造exp获取shell,从而读取flag。涉及的技巧包括利用printf的%n修改栈内数据,栈溢出覆盖特定位置字符,以及泄露libc地址等。
摘要由CSDN通过智能技术生成

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-0x18ebp-0x20为8位,我们得到payload并写出exp:

payload = "a" * 8 + p64(1926)

hello_pwn

ida载入发现这个题目和when_did_you_born两个题目是一样的。


查看两个数据,发现在内存中相邻,所以本题和上上题是一样的。


计算距离为:4位。可以写出exp:

payload = 'a'*4 + p64(0x6E756161)

运行得到flag:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值