shellcode

Posted by Humb1e on 2023-02-13
Estimated Reading Time 2 Minutes
Words 503 In Total
Viewed Times

HGAME WEEK4 REVERSE shellcode

shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。

但是这道题目对于shellcode的定义应该是从机器码出发的,并不是利用程序漏洞。

image-20230213230108227

通过ida对函数的分析我们大概可以知道这是用GO语言编写的程序

GO的主函数一般都是以main_main命名的,找到他

image-20230213230432088

可以看到几处明显的base64解密

密文里也有’+‘这种比较显著的base64符号

看了官方wp才发现010editor有那么强大的功能可以直接从base64解码并粘贴

image-20230213230729005

粘贴完后直接保存为.exe放到ida里就能发现一个比较标准的tea加密(要先p一下创建函数)

image-20230213230825018

解码脚本:

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
#include <stdio.h>  
#include <stdint.h>
void decrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum = 32*(-0x543210dd), i;
uint32_t delta =0x543210dd; //在这里发现很多大佬的wp都是用了sum=32*0x12345ef sum每轮减去0x12....来实现解密的,其实这两个数相加就是0(受位数限制),所以两者并没有区别
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;
}
v[0] = v0; v[1] = v1;
}

int main()
{
uint32_t v[] = {0xe4b36920,0x936924d0,0xa816d144,0xaa82d5f5,0x3679f0da,0x7f32fd06,
0x3460c0d3,0xb7214939,0xe57269a2,0x836a51fa}, k[4] = { 22,33,44,55 };
for (int i = 0; i < 5; i++) {
decrypt(&v[i*2], k);
}
printf("%s",v);
return 0;
}//这里v的值也要注意一下,因为最后给的是flag.enc文件,是小端序存储的,所以v的取值要以四个字节为单位反着输入
//hgame{th1s_1s_th3_tutu's_h0mew0rk}

如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !