历年真题刷题小记

是收录在攻防世界真题区的刷题记录,在网上找到的wp大多是各战队比赛时的简单思路,没有很具体的做法,顺便也想趁机给自己记录和总结一下(orz。

题目指路:https://adworld.xctf.org.cn/competition

刷题范围:2019年以来的比赛中>=20解的逆向题,循序渐进吧。

P.S. 起步tcl,会有参考其他wp的思路,什么时候没有参考wp了就说明我终于能单刷了(yep!

[2019 *CTF] fanoGo

题目描述

Do you kown go & fano encode?

$ nc 34.92.37.22 10001

wp

相关工具/插件:[IDA] IDAGolangHelper

用了插件以后,主函数一般是main_main,所以找到主函数。

image-20201209095047799

然后看到一行fano___Fano__Decode()

image-20201209095144599

于是猜测是让我们输入数据,经过fanoDecode解码后等于该字符串(就是说输入数据=该字符串的fano编码)。

(我摊牌,Go实在看不懂,这里参考wp的思路了。不过如果实在做不出来我可能也会这么猜(?

然后在函数栏搜索能看到,打包的时候把fanoEncode函数也装进来了,所以想到patch call直接复用。

image-20201209095753661

然后patch。

这里整理一下x86的call机器码格式(x64向下兼容:

  • E8 xxxxxxxx

    xxxxxxxx是偏移地址

    偏移地址=目标地址-当前地址-5(取完当前指令之后,pc先自增,程序再跳转;E8 xxxxxxxx有5字节

  • FF 15 [xxxxxxxx]

    xxxxxxxx是绝对地址,FF15会对当前的这个绝对地址解*号,也就是绝对地址[目标地址]

原来的:

image-20201209101939711

先找到fanoEncode的地址:

image-20201209102205135

可以看到fanoEncode的地址为0x45C970。

然后计算偏移地址:

image-20201209102347927

patch(别忘了小端序):

image-20201209102138760

patch完以后愉快地开始动态调试,配置完Debugger以后,为了看加密结果在fanoEncode函数的这里下断点。

image-20201209102735769

然后动态调试

image-20201209104605432

断点处打开Locals窗口(Debugger->Debugger windows->Locals)查看编码结果:

image-20201209105058643

image-20201209105119105

v3这里是结果的地址,我们复制下来并在IDA view里按G跳转

image-20201209105154151

把这个数组dump下来就是要输入的数据。

最后的exp:

#!/usr/bin/env python
# ------ Python2 ------
from pwn import *

# context.log_level='debug'
r=process("./fanoGo_ori")

arr=[0x2B, 0x60, 0xC3, 0xBE, 0xC2, 0xB7, 0xC2, 0x82, 0xC2, 0x89, 0xC3, 0x95, 0x5B, 0xC2, 0x87, 0x2A, 0x69, 0x13, 0xC2, 0x96, 0x51, 0xC3, 0xBD, 0x6F, 0x32, 0x28, 0x5A, 0xC3, 0x92, 0x74, 0xC2, 0x94, 0xC2, 0x94, 0xC2, 0x95, 0xC2, 0x96, 0xC2, 0xA4, 0xC3, 0x8A, 0xC2, 0xA3, 0xC3, 0x8E, 0xC2, 0xB3, 0x24, 0x24, 0x24, 0xC2, 0xBA, 0xC2, 0xAE, 0x46, 0x2B, 0xC2, 0xAC, 0x3C, 0xC3, 0xAB, 0x32, 0x23, 0x2A, 0xC3, 0xB0, 0xC3, 0xB3, 0xC2, 0xAC, 0xC3, 0x85, 0xC2, 0x87, 0x2C, 0xC2, 0xA3, 0x6B, 0xC2, 0xAD, 0x0F, 0xC3, 0x87, 0x5C, 0xC2, 0xA8, 0xC3, 0xB3, 0xC2, 0xAF, 0xC3, 0xA1, 0xC3, 0xB9, 0x12, 0xC3, 0x8A, 0x44, 0x72, 0xC2, 0xA6, 0xC2, 0x91, 0x66, 0x6D, 0x31, 0xC3, 0xA7, 0x51, 0x64, 0x67, 0x78, 0x75, 0x6B, 0xC2, 0x96, 0xC2, 0x91, 0x51, 0xC3, 0xA7, 0x3E, 0x13, 0xC3, 0x8E, 0x57, 0x7B, 0x47, 0xC2, 0x9D, 0x45, 0x7F, 0x29, 0x11, 0xC3, 0x95, 0xC3, 0xA1, 0xC3, 0xA7, 0x59, 0xC2, 0x8A, 0x06, 0xC2, 0x8C, 0xC2, 0x91, 0xC2, 0xB5, 0x0F, 0x3A, 0xC2, 0x8E, 0xC2, 0xBA, 0xC3, 0x8B, 0xC3, 0xAA, 0xC3, 0xA8, 0xC3, 0xBC, 0xC2, 0x8E, 0x71, 0xC3, 0xBD, 0x6F, 0x32, 0x36, 0xC3, 0xB9, 0x42, 0xC3, 0xA7, 0x49, 0xC3, 0x92, 0x22, 0x79, 0xC3, 0x89, 0xC3, 0x93, 0x54, 0x79, 0xC3, 0x96, 0x63, 0x6A, 0x1F, 0xC3, 0x96, 0xC3, 0xB3, 0x23, 0x6F, 0xC2, 0x94, 0x37, 0xC2, 0x94, 0xC3, 0xA8, 0x76, 0xC3, 0x83, 0xC3, 0x8E, 0x7C, 0x3F, 0xC2, 0xAD, 0xC3, 0xA0, 0xC2, 0x9F, 0x0C, 0xC2, 0xAA, 0x7B, 0xC3, 0x83, 0x26, 0xC2, 0xAD, 0xC3, 0xB0, 0x7E, 0x3A, 0xC3, 0xA5, 0x47, 0xC2, 0x9D, 0x7F, 0x09, 0xC3, 0xA5, 0x49, 0x44, 0xC2, 0xB0, 0xC2, 0xAF, 0x0F, 0x3A, 0xC3, 0x8C, 0x50, 0x51, 0xC3, 0xBD, 0x6F, 0x32, 0x2C, 0xC3, 0x8C, 0x2D, 0x27, 0x49, 0xC3, 0xA3, 0x2A, 0xC3, 0xB0, 0xC3, 0xB3, 0xC2, 0xAC, 0xC3, 0x88, 0xC2, 0x89, 0xC3, 0xB0, 0xC2, 0x9D, 0x7E, 0x1C, 0xC2, 0x9F, 0x29, 0x11, 0x41, 0x47, 0xC3, 0xB5, 0xC2, 0xBC, 0xC3, 0x88, 0xC2, 0x9A, 0x38, 0xC3, 0xB0, 0xC3, 0xA2, 0xC2, 0xB8, 0xC3, 0xA9, 0x15, 0xC3, 0x92, 0x50, 0x40]
payload=bytearray(arr[:0x136]) #看fano_Str2Bytes可以发现结果的长度为0x136
r.sendafter(':',payload)

r.interactive()

flag

因为要nc没拿到flag(

本地打通就好

image-20201209105707639


TBC...

posted @ 2020-12-31 23:29  c10udlnk  阅读(173)  评论(0编辑  收藏  举报