当前位置: 首页 > news >正文

FlareOn1 -- 5get_it

用 DIE 打开,是一个 dll

1

用 ida 打开,简单分析一下,是一个记录键盘按键的程序。里面的每个虚拟键码都有一个函数返回字符串

2

那么 flag 在哪里呢?看到左边函数窗口里看到有一个 DialogFunc,按 X 查找交叉引用,最后找到按下 "m" 对应的函数

3
image

执行 sub_10001240 的条件是 dword_100194FC > 0。
dword_100194FC 的初始值是 0,再找 dword_100194FC 的交叉引用,看看哪里把它改成了 1,最后找到了 "o" 对应的函数

image

按照这个方法,逐步追溯每个变量改变的条件,所有按键对应的的字符连起来就是 flag

import idautils
import idaapi
import idc
import copytarget_var_ea = 0x100194FC
target_var_value = 1
asc_string = 'm'init_func_ea = 0x10001060print("*********************************")def get_initial_status(func_ea):status = dict()for ea in idautils.FuncItems(func_ea):insn = idaapi.insn_t()idaapi.decode_insn(insn, ea)if insn.itype == idaapi.NN_mov and insn.ops[0].type == idaapi.o_mem and insn.ops[1].type == idaapi.o_imm:status[insn.ops[0].addr] = insn.ops[1].valuereturn statusinit_status = get_initial_status(init_func_ea)
current_staus = copy.deepcopy(init_status)def get_target_status(func, target_ea):status = dict()flowchart = idaapi.FlowChart(func)target_block = None# 找到目标地址所在的块for block in flowchart:if block.start_ea <= target_ea < block.end_ea:target_block = blockbreak# 获取函数返回值mov_eax_addr = idc.prev_head( # mov eax, immidc.prev_head(            # pop ebpidc.prev_head(        # retfunc.end_ea)))insn = idaapi.insn_t()idaapi.decode_insn(insn, mov_eax_addr)asc_addr = 0if insn.itype == idaapi.NN_mov and insn.ops[0].type == idaapi.o_reg and insn.ops[1].type == idaapi.o_imm:asc_addr = insn.ops[1].valueelse:raise Exception("not \"mov eax, imm\"")# 反向遍历块,获取运行到目标地址所需要的所有条件while True:pre_blocks = target_block.preds()pre_count = 0for block in pre_blocks:pre_count += 1if pre_count > 1:raise Exception("too many preds")cmp = idaapi.insn_t()idaapi.decode_insn(cmp, idc.prev_head(idc.prev_head(block.end_ea)))jcc = idaapi.insn_t()idaapi.decode_insn(jcc, idc.prev_head(block.end_ea))if cmp.itype == idaapi.NN_cmp and cmp.ops[0].type == idaapi.o_mem and cmp.ops[1].type == idaapi.o_imm and cmp.ops[1].value == 0 and jcc.itype == idaapi.NN_jle:if jcc.ops[0].addr == target_block.start_ea:status[cmp.ops[0].addr] = 0else:status[cmp.ops[0].addr] = 1else:raise Exception("not \"cmp mem, 0\" and \"jle addr\"")target_block = blockif pre_count == 0:break# 返回结果return status, asc_addrstart_at = 0
while start_at == 0:# 遍历所有引用目标变量的地方target_count = 0for xref in idautils.XrefsTo(target_var_ea):insn = idaapi.insn_t()idaapi.decode_insn(insn, xref.frm)# 找到达到目标状态的 movif insn.itype == idaapi.NN_mov and insn.ops[1].type == idaapi.o_imm and insn.ops[1].value == target_var_value:target_count += 1if target_count > 1:raise Exception("too many targets")func = idaapi.get_func(xref.frm)status, asc_addr = get_target_status(func, xref.frm)print(status)print(idc.get_strlit_contents(asc_addr))asc_string = idc.get_strlit_contents(asc_addr).decode() + asc_string# 对比初始状态,找到变化的量change_count = 0for addr in status:if addr in init_status:if init_status[addr] != status[addr]:change_count += 1if change_count > 1:# raise Exception("too many changes")breakprint(f'change: {addr:x} -> {status[addr]}')target_var_ea = addrtarget_var_value = status[addr]else:raise Exception("uninitialzed var")if change_count == 0:start_at = func.start_eaprint(f'start at {start_at:x} ({idc.get_func_name(start_at)})')print(asc_string)

image

l0ggingdoturdot5tr0ke5atflaredashondotcom
l0gging.ur.5tr0ke5@flare-on.com
提交,都不对。
上网搜一下,答案是 l0gging.Ur.5tr0ke5@flare-on.com

这里只是通过虚拟键码判断,没有区分大小写,也没有处理 Shift 和 CapsLock,所以没弄清楚为什么 U 会是大写……

http://www.hskmm.com/?act=detail&tid=23117

相关文章:

  • 2025 年阀门厂家 TOP 企业品牌推荐排行榜,管道阀门,气动,调节,电动执行器,生产,电磁,不锈钢,进口,耐高温阀门推荐这十家公司
  • 深入解析:Ceph 分布式存储学习笔记(二):池管理、认证和授权管理与集群配置(下)
  • tcp与udp 协议 - 摘星
  • 赛前训练4 extra 字典树
  • CF1450E Capitalism
  • 二分图最大匹配 匈牙利算法
  • 2025 年脱硫剂厂家 TOP 企业品牌推荐排行榜,氧化铁,羟基氧化铁,常温氧化铁,沼气,天然气,煤气,煤层气,液化气,二氧化碳,氨气脱硫剂公司推荐
  • 2025 年砝码厂家 TOP 企业品牌推荐排行榜,不锈钢,标准,校准,天平,无磁,锁型,蓬莱,铸铁,定制,单双钩砝码公司推荐!
  • Java 在Word 文档中添加批注:高效文档协作的利器 - 指南
  • 2025雨棚生产厂家 TOP 企业品牌推荐排行榜,西安,陕西,西北推拉雨棚,推拉,移动,活动,户外,电动伸缩雨棚推荐这十家公司!
  • 关于整除分块
  • 2025 年木工机械设备厂家 TOP 企业品牌推荐排行榜,深度剖析木工机械设备推荐这十家公司!
  • Python语言自动玩游戏的消消乐游戏程序代码3QZQ
  • Python语言自动玩游戏的数字拼图游戏程序代码ZXQMQZQ
  • 如何找出集合的两个子集使得和相等?
  • Python语言自动玩游戏的俄罗斯方块游戏程序代码QZQ
  • Spring AI(七)Spring AI 的RAG搭建集合火山向量模型+阿里云Tair(企业版)
  • Python语言自动玩游戏的数字拼图游戏程序代码QZQ
  • 赛前训练4 字符串哈希
  • 英语
  • 处处吻
  • ThreadLocal原理与使用详解
  • WinCC监控框架实战解析:打通物联网网关的关键步骤
  • 2025国庆Day1
  • 2025 年包装印刷厂家 TOP 企业品牌推荐排行榜,西安,陕西,咸阳包装印刷,礼盒,定制,设计,优质,品质,环保,生产包装印刷公司推荐!
  • 2025 绝对式编码器厂家 TOP 企业品牌推荐排行榜,增量绝对式编码器,多圈绝对式编码器,二进制绝对式编码器 /ssi 绝对式编码器,拉线绝对式编码器公司推荐!
  • 2025 编码器厂家 TOP 企业品牌推荐排行榜,无磁,光学,脉冲,绝对型,伺服,机械多圈,工业,二进制,拉线编码器公司推荐
  • 2025 年玻璃钢水箱厂家 TOP 企业品牌推荐排行榜,30 吨,订做,消防,专业,方形,拼装式,屋顶,大型玻璃钢水箱推荐这十家公司!
  • 禁止DataGridView自动根据数据源的结构生成列
  • 2025 年压球机厂家 TOP 企业品牌推荐排行榜,新型,高压,节能,双螺旋干粉,对辊,煤粉,超低压压球机公司推荐!