网鼎杯2022青龙组Re复现

[网鼎杯 2020 青龙组]jocker

image-20231217094926035

IDA打开

image-20231217095921221

看到VirtualProtect函数。SMC自修改。

image-20231218192956984

这里对地址的值进行了复原,写个idapython进行复原(或者动态调试复原)

addr = 0x401500
for i in range(187):
    key = idc.get_db_byte(addr+i) ^ 0x41
    idc.patch_byte(addr+i,key)
print('done')

之后对全部数据U了后,复原即可。

可以得到

image-20231218193500566

image-20231218193515441

第一处将密文和Buffer数组异或即可得到第一部分flag。

第二处给了v3、后面有随机数,不太清楚干了什么,因为flag最后一位是 ‘}’ ,猜测一下用是用v3 和 rand 异或。

enc = [14, 13, 9, 6, 19, 5, 88, 86, 62, 6, 12, 60, 31, 87, 20, 107, 87, 89, 13]
Buffer = 'hahahaha_do_you_find_me?'
flag = []
for i in range(19):
    flag.append(chr(ord(Buffer[i]) ^ enc[i]))
enc2 = '%tp&:'
k = 0
for i in range(20,127):
    if i ^ ord(':') == ord('}'):
        k = i
for i in range(5):
    flag.append(chr(ord(enc2[i]) ^ k))
print(''.join(flag))
# flag{d07abccf8a410cb37a}

[网鼎杯 2020 青龙组]singal

image-20231218194408715

image-20231221162933507

虚拟机逆向的题目,v4是opcode,vm_operad里面有指令操作。

image-20231221163422708

查看一下指令操作

image-20231221163031806

翻译指令为汇编语言,根据opcode全部输出出来就可以得到程序逻辑,逆向一下就可以了。

这一题也可以使用angr符号执行。找到输出正确答案的地方:
image-20231221163526789

以及输出错误信息的地方:
image-20231221163548836

下面是angr符号执行的脚本:

import angr
import sys


def main(argv):
    path_to_binary = 'signal.exe'
    project = angr.Project(path_to_binary)
    initial_state = project.factory.entry_state(
        add_options={angr.options.SYMBOL_FILL_UNCONSTRAINED_MEMORY,
                     angr.options.SYMBOL_FILL_UNCONSTRAINED_REGISTERS}
    )
    simulation = project.factory.simgr(initial_state)

    print_good_address = 0x0040179E
    will_not_succeed_address = 0x004016E6
    simulation.explore(find=print_good_address, avoid=will_not_succeed_address)

    if simulation.found:
        solution_state = simulation.found[0]
        print(solution_state.posix.dumps(sys.stdin.fileno()).decode())
    else:
        raise Exception('Could not find the solution')


if __name__ == '__main__':
    main(sys.argv)

得到:757515121f3d478


[网鼎杯 2022 青龙组]fakeshell

image-20231218195249204

有UPX壳。直接脱会失败,修改了upx标识,WinHex复原

image-20231218195405636

主函数:

image-20231221163742912

要求输出flag,赋值给v6,之后对v6进行俩次处理,判断是否为Right

第一处:
image-20231221163939340

先是判断flag长度,再跟0x66异或。

image-20231221164038404

做了一次+10异或0x50;

将密文提取出来:
image-20231221164322799

EXP:

enc = [75, 72, 121, 19, 69, 48, 92, 73, 90, 121, 19, 112, 109, 120, 19, 111, 72, 93, 100, 100]
flag = []
for i in range(20):
    flag.append(chr(((enc[i] ^ 0x50) - 10 ) ^ 0x66))
print(''.join(flag))
# why_m0dify_pUx_SheLL
  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sciurdae.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值