flow

这道题感觉都被人做烂了,我也是赛后才做出来,实在是太菜了。

简单说说这题吧,流程其实就是一个RC4和一个魔改TEA加密,RC4可以通过对IDA中未定义的函数段重新定义后就能看出来。

image-20201019235640204

TEA的话可以通过findcrypt看出特征值,但魔改的话还得看调试看出来,写这道题的目的还是想了解下SROP技术,帖子的话可以参考这个链接https://www.freebuf.com/articles/network/87447.html

我的话就根据这个链接讲解下本题是如何利用这项技术的,首先看到IDA未定义的函数末尾都有一个

image-20201020075740296

syscall系统调用,这是触发sigreturn系统调用的关键代码,执行这段代码将内核为该进程恢复之前保存的上下文,最后恢复进程的执行,而之前的上下文数据都会保存在栈上。

img

在程序读取输入之后,先会做一个ascii转16进制,然后通过构造数据利用memcpy造成栈溢出,在溢出函数最后返回时看下栈上的数据。rt_sigreturn是Signal Frame段的起始位置

image-20201020081142406

能造成SROP的原理就攻击者可以篡改进程恢复之前保存的上下文数据,伪造恢复之后的状态,在本题中执行syscall后,返回之后的状态就是根据Signal Frame的数据完成的。

image-20201020083124211

可以看到ip,sp,bp等寄存器都对应Signal Frame上的数据,这样就成功劫持了程序的控制流。后续的话就是动调分析代码了,这里不再详细阐述了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <stdint.h>

void tea_decrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum, i;
uint32_t delta = 0x9e3779b9;
sum = delta << 5;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i<32; i++) {
v0 -= ((v1 << 4) + k2) ^ (v1 + sum) ^ ((v1 >> 5) + k3);
v1 -= ((v0 << 4) + k0) ^ (v0 + sum) ^ ((v0 >> 5) + k1);
sum -= delta;
}
v[0] = v0; v[1] = v1;
}

void Xor(unsigned int v, uint8_t* k)
{
int v0 = v % 256;
int v1 = (v >> 8) % 256;
int v2 = (v >> 16) % 256;
int v3 = (v >> 24);
k[0] ^= v0;
k[1] ^= v1;
k[2] ^= v2;
k[3] ^= v3;
}
int main()
{
unsigned int tea_key[4] = { 0x79757361,0x79796473,0xDEADBEEF,0xAA114514 }; //解密tea算法的4个key

unsigned int c[4] = { 0x189BE35C, 0x1109831A, 0x3E530874, 0x4B8898EB}; //密文
// c为要加密的数据是两个32位无符号整数
// k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
//printf("加密前原始数据:%u %u\n",v[0],v[1]);
//encrypt(v, k);
//printf("加密后的数据:%u %u\n",v[0],v[1]);
unsigned char rc4_key[] = { 0x60,0xCF,0xB4,0xE7,0x52,0x33,0x98,0xE6,0xC0,0xB5,0x1D,0x8,0x8A,0xE2,0x5E,0x86 }; //rc4的密钥
tea_decrypt(&c[0], tea_key);
tea_decrypt(&c[2], tea_key);
for (int i = 0; i < 4; i++)
{
Xor(c[i], &rc4_key[i * 4]);
}
printf("flag:\n");
for (int i = 0; i<16; i++)
{
printf("%2x", rc4_key[i]);
}
getchar();
}
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2022 llx-moon
  • Visitors: | Views:

请我喝杯咖啡吧~