Nepctf2023 Review 出题思路及WP

这篇具有很好参考价值的文章主要介绍了Nepctf2023 Review 出题思路及WP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原设计图

Flag格式

NepCTF{%s}

逻辑复原

main

UPX拆壳,main函数逻辑复原得到

  • getInput
  • checkInputFormat
  • debuggerCheck
    • 如果存在,则加密一些数据
  • cotIsDebuggerPresent++
  • checkCRC
  • checkBreakPoint1
  • checkBreakPoint2
  • thread3
  • FinalCheck

checkCRC

  • CRCcheck
  • cotCRCcheck++
  • create CRC thread
    • function: checkCRC

checkBreakPoint1

  • BreakPoint则cotBreakPoint++
  • 其它的则不管

checkBreakPoint2

  • 检测cotBreakPoint个数,判断是否失败

thread3

  • checkCRC
  • keyTEA
keyTEA[0] = 0x19 * cotIsDebuggerPresent;
keyTEA[1] = 0x28 * cotBreakPoint1;
keyTEA[2] = 0x37 * cotCRCcheck;
keyTEA[3] = cotIsDebuggerPresent + cotCRCcheck + cotBreakPoint1
  • xxTEA加密,分析密钥结构可以知道是keyTEA
    • xxTEA可以看加密结构判断,TEA族加密可以通过魔数看出
  • cotSame = flag经过xxTEA后得到的字符串中,相邻且相同的字符个数
  • BitInvert
  • keyAES
keyAES->m128i_i8[0] = 0x19 * cotIsDebuggerPresent;
keyAES->m128i_i8[1] = 5 * cotBreakPoint1 * 8;
keyAES->m128i_i8[2] = 0x37 * cotCRCcheck;
keyAES->m128i_i8[3] = cotSame + cotIsDebuggerPresent + cotBreakPoint1 + cotCRCcheck;
keyAES->m128i_i8[4] = 0x19 * cotIsDebuggerPresent;
keyAES->m128i_i8[5] = 5 * cotBreakPoint1 * 8;
keyAES->m128i_i8[6] = 0x37 * cotCRCcheck;
keyAES->m128i_i8[7] = cotIsDebuggerPresent + cotBreakPoint1 + cotCRCcheck - cotSame;
keyAES->m128i_i8[8] = 70 * cotIsDebuggerPresent;
keyAES->m128i_i8[9] = 85 * cotBreakPoint1;
keyAES->m128i_i8[10] = 100 * cotCRCcheck;
keyAES->m128i_i8[11] = cotSame + cotIsDebuggerPresent + cotBreakPoint1 + cotCRCcheck;
keyAES->m128i_i8[12] = 70 * cotIsDebuggerPresent;
keyAES->m128i_i8[13] = 85 * cotBreakPoint1;
keyAES->m128i_i8[14] = 100 * cotCRCcheck;
keyAES->m128i_i8[15] = cotIsDebuggerPresent + cotBreakPoint1 + cotCRCcheck - cotSame;

  • AES
  • checkCRC

FinalCheck

  • 检查加密后的数据和cmpVal是否相同
  • 不同的话触发异常处理,要求输入不需要的password并且不可能正确

WP

只有cotSame是不确定的值,范围是0~47,后面爆破即可
cotXXX全部都是固定的,只有动态调试的时候会因为触发检测而错误,静态分析显然可以得到不同时刻的状态表

int main() {
    unsigned char flag[SIZE + 1] = "NepCTF{tEA_with_AES_by_mixing_antiDebug_hahaHah}";
    unsigned char comp[SIZE + 1] = { 0 };
    data.cot_Anti1 += 1;
    data.cot_Anti3 += 1;
    data.cot_Anti3 += 1;
    unsigned int keyTEA[4];
    keyTEA[0] = data.cot_Anti1 * 0x19;
    keyTEA[1] = data.cot_Anti2 * 0x28;
    keyTEA[2] = data.cot_Anti3 * 0x37;
    keyTEA[3] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3;
    xxtea_uint_encrypt((unsigned int*)flag, SIZE/4, (unsigned int*)keyTEA);
    data.cot_same = 0;
    data.cot_Anti2 += 1;
    for (int i = 0; i < SIZE; i++) {
        flag[i] = ~flag[i];
    }
    unsigned char* keyAES = new unsigned char[16];
    keyAES[0] = data.cot_Anti1 * 0x19;
    keyAES[1] = data.cot_Anti2 * 0x28;
    keyAES[2] = data.cot_Anti3 * 0x37;
    keyAES[3] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3 + data.cot_same;
    keyAES[4] = data.cot_Anti1 * 0x19;
    keyAES[5] = data.cot_Anti2 * 0x28;
    keyAES[6] = data.cot_Anti3 * 0x37;
    keyAES[7] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3 - data.cot_same;
    keyAES[8] = data.cot_Anti1 * 0x46;
    keyAES[9] = data.cot_Anti2 * 0x55;
    keyAES[10] = data.cot_Anti3 * 0x64;
    keyAES[11] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3 + data.cot_same;
    keyAES[12] = data.cot_Anti1 * 0x46;
    keyAES[13] = data.cot_Anti2 * 0x55;
    keyAES[14] = data.cot_Anti3 * 0x64;
    keyAES[15] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3 - data.cot_same;
    //for (int i = 0; i < 16; i++)
    //   printf("%hx", keyAES[i]);
    aesEncrypt((const unsigned char*)keyAES, 16, (const unsigned char*)flag, (unsigned char*)comp, SIZE);
    data.cot_Anti3 += 1;
    for (int i = 0; i < SIZE; i++)
        printf("%#hx, ", comp[i]);
    return 0;
}
int main() {
	for (int i = 0; i < 48; i++) {
		unsigned char flag[SIZE + 1] = { 0xf4, 0x9c, 0xdd, 0x41, 0x3, 0xdd, 0x5a, 0x13, 0x2e, 0x55, 0x97, 0x9e, 0xff, 0xd5, 0x8, 0xd9, 0xf6, 0xd1, 0x9, 0x8c, 0x68, 0x9e, 0x92, 0xff, 0x75, 0xf, 0x80, 0x95, 0x4b, 0x16, 0xb9, 0xc6, 0x7f, 0x54, 0x2e, 0x20, 0x35, 0xfc, 0x1b, 0x46, 0x14, 0xaa, 0xda, 0x5e, 0x4f, 0xbd, 0x59, 0x71 , 0 };
		unsigned char comp[SIZE + 1] = { 0 };
		data.cot_Anti1 = 1;
		data.cot_Anti2 = 1;
		data.cot_Anti3 = 2;
		data.cot_same = i;
		unsigned char* keyAES = new unsigned char[16];
		keyAES[0] = data.cot_Anti1 * 0x19;
		keyAES[1] = data.cot_Anti2 * 0x28;
		keyAES[2] = data.cot_Anti3 * 0x37;
		keyAES[3] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3 + data.cot_same;
		keyAES[4] = data.cot_Anti1 * 0x19;
		keyAES[5] = data.cot_Anti2 * 0x28;
		keyAES[6] = data.cot_Anti3 * 0x37;
		keyAES[7] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3 - data.cot_same;
		keyAES[8] = data.cot_Anti1 * 0x46;
		keyAES[9] = data.cot_Anti2 * 0x55;
		keyAES[10] = data.cot_Anti3 * 0x64;
		keyAES[11] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3 + data.cot_same;
		keyAES[12] = data.cot_Anti1 * 0x46;
		keyAES[13] = data.cot_Anti2 * 0x55;
		keyAES[14] = data.cot_Anti3 * 0x64;
		keyAES[15] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3 - data.cot_same;
		aesDecrypt((const unsigned char*)keyAES, 16, (const unsigned char*)flag, (unsigned char*)comp, SIZE);
		for (int i = 0; i < SIZE; i++) {
			comp[i] = ~comp[i];
		}
		data.cot_Anti2 = 0;
		unsigned int keyTEA[4];
		keyTEA[0] = data.cot_Anti1 * 0x19;
		keyTEA[1] = data.cot_Anti2 * 0x28;
		keyTEA[2] = data.cot_Anti3 * 0x37;
		keyTEA[3] = data.cot_Anti1 + data.cot_Anti2 + data.cot_Anti3;
		xxtea_uint_decrypt((unsigned int*)comp, SIZE / 4, (unsigned int*)keyTEA);
		for (int i = 0; i < SIZE; i++)
			printf("%c", comp[i]);
		printf("\n");
	}
	return 0;
}

经测试,仅有cot_same==0时有合法flag文章来源地址https://www.toymoban.com/news/detail-645197.html

NepCTF{tEA_with_AES_by_mixing_antiDebug_hahaHah}

到了这里,关于Nepctf2023 Review 出题思路及WP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 根据cadence设计图学习硬件知识day05 了解一些芯片

    1.NXS0102DC 介绍         NXS0102是一款2位双电源转换收发器,具有自动方向感测功能,可实现双向电压电平转换。它具有两个2位输入输出端口(An和Bn)、一个输出使能输入(OE)和两个电源引脚(VCC(A)和VCC(B))。VCC(A)可以以1.65V和3.6V之间的任何电压供电,VCC(B)可

    2023年04月26日
    浏览(28)
  • 前端 vue 解决按1920*1080设计图做的页面适配屏幕缩放并适配4K屏

    提示:前端 vue 解决按1920*1080设计图做的页面适配屏幕缩放并适配4K屏 公司项目做之前没有沟通好,按照1920*1080设计图做的页面,缩放比是100%,项目做完之后说要适配缩放比,并且 适配4k屏,然后就各种百度找办法。 这种方法也是通过看别人发布的文章解决的,原来的地址在

    2024年02月02日
    浏览(43)
  • 【O2O领域】Axure外卖订餐骑手端APP原型图,外卖配送原型设计图

    页面数量:共 110+ 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:外卖配送、生鲜配送 作品申明:页面内容仅用于功能演示,无实际功能 本品为外卖订餐骑手端APP原型设计图,定位属于外卖海外版,覆盖配送APP主流功能,除了结算是菲律宾比索,功能与国内版大同小异

    2024年02月12日
    浏览(34)
  • 【O2O领域】Axure外卖订餐骑手端APP原型图,外卖众包配送原型设计图

    页面数量:共 110+ 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:外卖配送、生鲜配送 作品申明:页面内容仅用于功能演示,无实际功能 本品为外卖订餐骑手端APP原型设计图,定位属于外卖海外版,覆盖配送APP主流功能,除了结算是菲律宾比索,功能与国内版大同小异

    2024年02月12日
    浏览(28)
  • 基于SpringCloud微服务自动出题题库系统设计与实现

    题库是“在计算机系统中,按照教育测试方案进行完成的某课程题目的总和,是在教学研究模型基础上通过建立发展起来的教育测量工具。”完善的题库管理系统可以减轻教师的出卷工作负担,全面系统的给出规范完整的试卷。目前已有众多专家学者在题库系统领域做了大量

    2024年02月11日
    浏览(26)
  • 2023国赛数学建模A题思路分析 - 定日镜场的优化设计

    # 1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统, 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件,其底

    2024年02月09日
    浏览(24)
  • 2023华数杯数学建模B题思路分析 - 不透明制品最优配色方案设计

    B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此,不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而,传统的人工配色 存在一定的局限性,如主观性强、效率低下等。因此,研究如何通过计算机方法 来实

    2024年02月14日
    浏览(30)
  • 2023高教社杯 国赛数学建模A题思路 - 定日镜场的优化设计

    A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统, 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件,其底座由 纵向

    2024年02月09日
    浏览(28)
  • 2023国赛数学建模A题第一问解题思路 - 定日镜场的优化设计

    A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统, 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件,其底座由 纵向

    2024年02月09日
    浏览(26)
  • 2023年华数杯数学建模B题思路代码分析 - 不透明制品最优配色方案设计

    # 1 赛题 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此,不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而,传统的人工配色 存在一定的局限性,如主观性强、效率低下等。因此,研究如何通过计算机

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包