首页 > 逆向调试 > ISCC2011基础关-这是什么字符

ISCC2011基础关-这是什么字符

题目描述:wiki在一个shellcode上截取了一段代码,是“0C6E D0E0 24D7 D0E8 342E”结果发现是一段字母转换程序,那么把A—Z都转换出来会是什么呢?请把转换出来的字符按ASCII码由小到大写出来吧!

提示信息:反汇编试一下吧!

解题方法:新建一个文本文件,然后用C32Asm打开,写入0C6ED0E024D7D0E8342E,然后右键,选择“对应汇编模式编辑”,就可以看到反汇编代码了:

00000000:  0C 6E                      OR      AL,6E
00000002:  D0E0                       SHL     AL,1
00000004:  24 D7                      AND     AL,D7
00000006:  D0E8                       SHR     AL,1
00000008:  34 2E                      XOR     AL,2E

看到这里之后就简单了,简单的位运算,写个C++模拟一下就好了。

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
// 作者:代码疯子
// 博客:http://www.programlife.net/ (程序人生)
#include <iostream>
#include <algorithm>
using namespace std;
 
char transfun(int s)
{
	// 说明:因为char的范围不够,所以这里用了int
	// 返回时使用什么类型无所谓了,只要接收的是char即可
	s |= 0x6E;
	s = s << 1;
	s &= 0xD7;
	s = s >> 1;
	s ^= 0x2E;
	return s;
}
 
int main(int argc, char **argv)
{
	char s, tmp[26];
	int i;
	for (s = 'A'; s <= 'Z'; ++s)
	{
		tmp[s - 'A'] = transfun(s);
	}
	sort(tmp, tmp + 26);
	for(i = 0; i < 26; ++i)
	{
		putchar(tmp[i]);
	}
	putchar('\n');
 
	return 0;
}

输出结果是DDDDDDDDDDDDDEEEEEEEEEEEEE,但是提交的时候说错了,后来输入DE,就过了。题目没有说清楚[em016]
C32ASM反汇编


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> ISCC2011基础关-这是什么字符
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: 逆向调试 标签: , ,
  1. 2011年6月12日17:53 | #1

    这道题我也搞了一会,呵呵

    [回复]

  2. 2011年6月12日20:13 | #2

    @youstar
    (⊙v⊙)嗯 我在那个群里看到过你 [em012]

    [回复]