Computer Security

#17 어셈블리어 예제 본문

컴퓨터구조&어셈블리어

#17 어셈블리어 예제

쿠리 Kuri 2022. 6. 2. 18:30
end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가?
 
[Register]
rcx = 0
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10
0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d
0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c
0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00
=======================
[code]
1: mov dl, BYTE PTR[rsi+rcx]
2: xor dl, 0x30
3: mov BYTE PTR[rsi+rcx], dl
4: inc rcx
5: cmp rcx, 0x19
6: jg end
7: jmp 1

sol) 

1.  (dl은 8바이트 레지스터다.) PTR이라는 포인터 바이트에서 rsi 는 기본적인 주소 0x400000 을 의미하고, rcx는 offset을 의미한다.  이 PTR을 dl에 할당 해준다.

2.dl 안에있는 제일처음 숫자인 0x67과  0x30을 2진수로 변환한뒤에, XOR을 실행한다. (같으면 0, 다르면 1출력)

(ex. 67을 10진수로 표현하면,  103 이를 이진수로 표현하면, 1100111 이고, 0x30을 10진수로 표현하면, 48 이를 이진수로 표현하면, 110000   이 둘을 XOR연산하면, 1010111 이 나오고, 이는 십진수로 다시 표현하면, 87이다. 이것의 아스키코드는  W가 된다.)

  3.이의 결과 값이 다시 PTR안으로 들어간다. 여기서 주의할점! offset은 바뀌지 않았기때문에, 0x67 자리 대신에 87이 들어간다는것!!(정확히는 16진수겠지만 10진수로 편히 보면)  또 다른 공간을 할당하는것이 아닌 덧씌우는 느낌이다!

 4.rcx(ofsset)주소를 inc(1증가) 시킨다.

5. rcx(offset)주소가 0x19를 가리킬때까지, 즉 메모리상으론 0x400019가 될때 까지 offset을 1씩 증가시키면서 출력한다.

6.이는 0x400000 인 0x67부터 0x400018의 0x11까지 한자씩 출력이된다.

-> 배열안에다가 10진수로 바꾼 수들을 넣고, for 문을 통해 하나하나 0x30과 XOR연산을 시켜준뒤에, 그 즉시 출력하도록 해보았다.

 

코드)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main(void) {

	int a[26] = { 103,85,92,83,95,93,85,16,68,95,16,81,67,67,85,93,82,92,73,16,71,95,66,92,84,17 };
	int y = 48;
	
	for (int i = 0; i < 26; i++) {
		
		printf("%c", a[i] ^ y);
	}
	
}

 

결과값)

 

Comments