无壳,IDA打开64

分析start函数。 smc⾃解密,通常处理smc⾃解密有两种⽅法,如果是⽐较简单的⾃解密, 我们可以直接使⽤idapython写⼀个脚本即可解决,如果碰⻅运算不太好实现的smc⾃解密,⽐如这⾥。

尝试动态调试,我们要在下⽅的jmp指令处下断点

jmp跳转

右键analyzed 选Force 把红色代码部分P键定义成函数

F5起始地址,查看到main函数,猜测后面为init函数

优先查看init函数(先于main函数执行

部分main函数:

发现调⽤了fork 来创建⼦进程并执⾏了不同的逻辑

关于fork:

当程序调⽤fork函数时,系统会创建新的进程并为其分配资源;然后,会将原来进程的相关内容全部复制到新的进程中。

fork()函数被调⽤⼀次,但是会返回两次(⽗⼦进程各⼀次)

返回值分析:

1)在⼦进程 中,fork函数返回0

2)在⽗进程中,fork函数返回新创建⼦进程的ID

3)如果出现错误,fork返回⼀个负值

(对1和2的原因分析:①在⼦进程中通过调⽤getppid可以⽅便的知道⽗进程的PID;②没有⼀个函数可以使⽗进程获得其所有⼦进程 的PID。(所以在fork返回时,将⼦进程的PID直接返回给⽗进程))

特点:

1. ⽗、⼦进程共享正⽂段,不共享数据、堆、栈段,⼦进程获得⽗进程数据、堆、栈段的副本。

2. ⼦进程会获得缓冲区的副本,即fork前进程缓冲区中的数据未被flush掉,则fork后,⼦进程能够获得⽗进程缓冲区中的数据。

3. ⽗进程所有被打开的⽂件描述符都会被复制到⼦进程中。 注:fork之后处理⽂件描述符通常有两种情况: ①⽗进程等待⼦进程结束; ②⽗、⼦进程各⾃执⾏不同的正⽂段(⽗、⼦进程各⾃关闭不需要使⽤的⽂件描述符);

4. fork之后⽗、⼦进程的区别: ①fork的返回值; ②进程ID不同; ③⽗进程也不同; ④⼦进程的tms_utime、tms_stime、tms_cutime和tms_ustime均被设置为0; ⑤⽗进程设置的⽂件锁不会被⼦进程继承; ⑥⼦进程的未处理的闹钟被清除; ⑦⼦进程的未处理信号集设置为空集;

5. fork失败的两个主要原因: ①系统中进程数⽬已经达到上限; ②该实际⽤户的进程总数达到系统限制;

13 使⽤⽅法:

①⼀个进程希望复制⾃⼰,使得⽗、⼦进程执⾏不同的代码段。如⽗进程监听端⼝,收到消息后,fork出⼦进程处理消息,⽗进程仍 然负责监听消息。(⽗监听,⼦处理信息)

②⼀个进程需要执⾏另⼀个程序。如fork后执⾏⼀个shell命令。

分析init函数,

其实在这⾥的话就是⽗进程waitpid等待⼦进程,⼦进程执⾏真正的逻辑 并且⼦进程⽤了ptrace来反调试(⼀个进程只能被⼀个进程ptrace,如果你⾃⼰调⽤ptarce,这样其它程序就⽆法通过ptrace调试或者向 您的程序进程注⼊代码) 所以⽤调试器不能调试⼦进程,ptrace的处理要么就是让他不执⾏,要么就是直接将其nop掉 但是我们这⾥就是要想办法调试⼦进程,最⽅便的⽅法就是直接在其fork创建⼦进程之前,就ctrl+n强制设置rip跳转到⼦进程的逻辑执 ⾏

我ctrl+n没起作用。。。

点进去函数

cbc模式的tea,data1和data2每次加密都会更新,且每次的更新都和我们的输⼊有关 我们有最后的⽐较数据,data1和data2只知道初始值,所以以这些条件我们能解开前8字节(cmp → reverse_tea → xor_with_data → inp) 然后我们实现⼀下正向的加密去更新data,就可以得到下⼀轮的data1和data2 从⽽以此类推的计算出每次加密的8个字节 先解开我们的前⼋个字节

先解开我们的前⼋个字节

#include <stdio.h>
#include <stdint.h>
uint32_t data1 = 0x5F797274;
uint32_t data2 = 0x64726168; //初始的 data 值
void decrypt(uint32_t* v, uint32_t* k)
{
uint32_t delta = 0x9E3779B9;
uint32_t v0 = v[0], v1 = v[1], sum = (delta * 32) & 0xffffffff, i;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i < 32; i++)
{
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
}
v0 = v0 ^ data1;
v1 = v1 ^ data2;
v[0] = v0; v[1] = v1;
2021极客⼤挑战逆向疑题讲解 16
}
int main()
{
uint32_t temp[2] = { 0xC9FA3B95, 0x7CFD0735 };
uint32_t key[4] = { 0x65766967, 0x756F795F, 0x7075635F, 0x6165745F };
int i = 0;
decrypt(temp, key);
printf("%c%c%c%c%c%c%c%c", *((char*)&temp[0] + 0), *((char*)&temp[0] + 1), *((char*)&temp[0] + 2), *((char*)&temp[0] + 3), *((char*)&temp
return 0;
}

最后的脚本

#include <stdio.h>
#include <stdint.h>
uint32_t data1 = 0x5F797274;
uint32_t data2 = 0x64726168; //初始的data 值
void encrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum = 0, i;
data1 ^= v0;
data2 ^= v1;
v0 = data1;
v1 = data2;
uint32_t delta = 0x9E3779B9;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i < 32; i++)
{
sum += delta;
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
}
data1 = v0;
data2 = v1;
}
void decrypt(uint32_t* v, uint32_t* k)
{
uint32_t delta = 0x9E3779B9;
uint32_t v0 = v[0], v1 = v[1], sum = (delta * 32) & 0xffffffff, i;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i < 32; i++)
{
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
}
v0 = v0 ^ data1;
v1 = v1 ^ data2;
v[0] = v0; v[1] = v1;
}
2021极客⼤挑战逆向疑题讲解 17
int main()
{
uint32_t array[] = { 0xC9FA3B95, 0x7CFD0735, 0x958C7C9F, 0xC143B59E, 0x61741E89, 0xF47DCDC4, 0xD6E2A1F2, 0x6A38E9AD, 0xC2C16FEB, 0x8C0EE99
uint32_t key[4] = { 0x65766967, 0x756F795F, 0x7075635F, 0x6165745F };
int i = 0;
for (i = 0; i < 10; i += 2)
{
uint32_t temp[2];
temp[0] = array[i];
temp[1] = array[i + 1];
decrypt(temp, key);
printf("%c%c%c%c%c%c%c%c", *((char*)&temp[0] + 0), *((char*)&temp[0] + 1), *((char*)&temp[0] + 2), *((char*)&temp[0] + 3), *((char*)&tem
//更新data
encrypt(temp, key);
}
//SYC{ySaySanDian_Zh0n_La_y1n_Cha_xIan}
return 0;
}

Have a tea -(极客大挑战(SMC,fork相关推荐

  1. CTF Geek Challenge——第十一届极客大挑战Misc Write Up

    比赛时间:2020年10月17日早上9点 比赛时限:一个月 0x1 一"页"障目 宣传单里藏有flag,不过分成了三份 拼好如图: 0x2 壮言壮语 工具: 与佛论禅:http:/ ...

  2. CTF Geek Challenge——第十一届极客大挑战Web Write Up

    比赛时间:2020年10月17日早上9点 比赛时限:一个月 0x1 Welcome sha1绕过 Postman发送POST请求 sha1绕过 线索 Not Found But 这个Not Found ...

  3. [BUUCTF-pwn]——[极客大挑战 2019]Not Bad(ORW)(内涵peak小知识)

    [BUUCTF-pwn]--[极客大挑战 2019]Not Bad 又是一道收获满满的题目. peak小知识 seccomp: seccomp是一种内核中的安全机制,正常情况下,程序可以使用所有的sy ...

  4. 极客大挑战2020_CTF-Web-[极客大挑战 2019]HardSQL

    CTF-Web-[极客大挑战 2019]HardSQL 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得 ...

  5. BUUCTF Web [极客大挑战 2019]Havefun

    「作者主页」:士别三日wyx   此文章已录入专栏<网络攻防>,持续更新热门靶场的通关教程 「未知攻,焉知收」,在一个个孤独的夜晚,你完成了几百个攻防实验,回过头来才发现,已经击败了百分之 ...

  6. BUUCTF-web [极客大挑战 2019]PHP1 之 反序列化漏洞

    PHP反序列化漏洞 一,什么是序列与反序列 序列就是把数据转成可逆的数据结构,目的是方便数据的储存和传输,反序列就是将数据逆转成原来的状态,序列就是拆数据,使得传输或储存更容易的过程,反序列就是重新拼 ...

  7. 第十届极客大挑战——复现未解决的web和RE

    第十届极客大挑战--复现未解决的web和RE emmmm,有些题目是没做出来的,有机会复现,还有官方wp,所以看看,再记录一下 web - 性感黄阿姨,在线聊天 这道题我是真的服了,爆破name,,, ...

  8. 第11届极客大挑战writeup

    第11届极客大挑战writeup Web 朋友的学妹 EZwww 刘壮的黑页 Welcome EZgit 我是大黑客 ezbypass 知X堂的php教程 Re No RE no gain 我真不会写 ...

  9. 极客大挑战2020wp

    目录 Crypto 1. 二战情报员刘壮 2. 铠甲与萨满 3. 跳跃的指尖 5. 成都养猪二厂 5. 规规矩矩的工作 6. Simple calculation 7. babyRSA 8. 韡髻猊岈 ...

最新文章

  1. 图像识别:能在商业中如何运用
  2. 堆和栈的区别 (转贴)
  3. python输入星期几_Python练习实例31 | 输入首字母,判断是星期几
  4. linux redis 启动警告解决方法
  5. Linux下载安装配置FTP
  6. python smtp 群发邮件
  7. php表单确认密码,jQuery表单验证之密码确认实例详解
  8. keras实现简单lstm_深度学习(LSTM)在交通建模中的应用
  9. nginx 负载均衡tomcat
  10. JavaScript正则表达式 exec
  11. C语言指针年龄段分组,[问题]数字分组求和,当和最大的组与和最小的组差最小时,输出...
  12. 【OpenCV4】计算对称矩阵特征值和特征向量 cv::eigen() 用法详解和代码示例(c++)
  13. webpack安装问题(已解决)
  14. Reverse Polish notation(逆波兰式)
  15. 微信端视频播放时防止被浏览器劫持的问题
  16. 联想拯救者Y700评测 怎么样
  17. 第87篇ES之Elastica-php匹配多值字段及给Problem的elementName设中文分词ik
  18. D55_BMS_IntefaceBoard_RevA接口板电路设计图
  19. Linux学习笔记(22.1)——基于SPI + Regmap + IIO的ICM20608设备驱动
  20. mysql if查询_mysql使用if...else...来查询

热门文章

  1. log4j2配置文件log4j2.xml详解
  2. 可变悬挂与空气悬挂的区别_可变悬架和空气悬架的的区别是什么
  3. 手机怎么解决同ip多账号_抖音被限流,作品被判搬运,账号被判搬运限流,Dou?被封怎么办?...
  4. php5.6.33安装教程,centos7手动安装PHP5.6.33详解
  5. 数据中心暖通设计若干思考
  6. 关于无管网气体消防系统之你不知道的事
  7. 一图读懂《北京市数据中心统筹发展实施方案(2021-2023年)》
  8. 浅析综合布线系统中检测双绞线的几种方式
  9. 大型数据中心蓄电池规划与应用中的痛点及展望
  10. BlockChain:《Blockchain Gate》听课笔记——区块链的1.0架构 VS 区块链3.0架构+个人理解