티스토리 뷰

안녕하세요!

 

오늘은 지금까지 배웠던 어셈블리어 명령어들을 응용하여 난독화 프로그램을 만들어보겠습니다.

 

●난독화 (Obfuscation)

●難(어려울 난) + 讀 (읽을 독) = 코드를 읽기 어렵게 만드는 것.

●왜?? 코드를 보호하거나 알아보기 힘들게 하기 위해 난독화를 진행한다.

●누가?? 악성코드 제작자, 소프트웨어 개발자 등등

 

xor 명령어를 응용하여 "hello world!"를 난독화해서 출력하는 프로그램을 만들어보겠습니다.

 

 

다음과 같은 어셈블리 프로그램을 구현해봤습니다.

 

지금까지 작성해왔던 프로그램과는 다른점은 main section뿐만 아니라 임의로 loop이라는 section을 추가했다는 점입니다.

 

코드를 분석을 해보면, hello world! 문자열을 가진 message를 스택에 push 합니다.

 

esp는 스택의 최상단을 가리키므로 즉, [esp]는 스택에 저장되어 있는 문자열을 가리킵니다.

 

문자열을 eax에 복사를 하고, ecx에는 11을 저장합니다.

 

11을 넣는 이유는 문자열을 난독화하기 위해서 문자 하나씩 xor 연산이 총 12번 진행되어야하기 때문입니다.

 

loop section으로 jump하여 본격적으로 xor 연산을 시작합니다.

 

eax에는 문자열의 주소가 저장되어 있을 것이고 ecx에는 문자의 위치를 나타내므로 [eax+ecx]에는 각각의 문자들을 가리킵니다.

 

ecx가 처음에는 11이므로 맨 마지막 문자인 '!'를 가리키고, byte 형식의 0x33과 xor 연산을 합니다.

 

연산이 끝난 뒤에 ecx를 1 감소 시키는 이유는 문자열의 끝에서부터 앞으로 이동하면서 모든 문자에 대해서 xor 연산을 수행하기 위함입니다.

 

ecx의 값이 0이되면 모든 문자의 난독화가 완료되었다는 것이므로 스택에 message를 push하고 난독화가 완료된 해당 문자열을 출력합니다.

 

그러면 gdb를 사용하여 프로그램이 어떻게 동작하는지 확인해보겠습니다.

 

 

main에 break point를 걸고 명령어를 하나씩 실행하면서 레지스터를 확인해보겠습니다.

 

 

main의 코드를 보니 0x804a010을 push하고 있습니다.

 

String으로 출력을 해보니 hello world!\n 문자열을 의미하네요!

 

 

esp에는 0xbffff15c라는 주소가 저장되어있습니다.

 

이 주소에 어떤 값이 저장되어 있는지 확인을 해봤습니다.

 

출력은 4바이트로 출력하기위해 옵션을 x/4wx로 주고 출력을 해봤더니 스택에 push했던 0x804a010이 저장되어 있었습니다.

 

esp는 문자열이 저장된 스택의 위치를 가리키고 있습니다.

 

[esp]는 문자열을 의미하고, 문자열을 eax에 복사합니다.

 

ecx에는 0xb 즉 11을 ecx에 복사한뒤에 loop section으로 jump합니다.

 

 

loop section으로 넘어와서 [eax+ecx*1]과 0x33을 xor 연산하고 있습니다.

 

[eax+ecx]이 어떤 값을 의미하는지 확인해보면 eax에는 0x804a010, 즉 문자열의 맨 앞 주소를 가리키고 ecx에는 11이 저장되어 있습니다.

 

eax와 ecx를 더하면 0x804a01b가 되므로 그 값을 string으로 출력을 해보니 문자열에서 맨 마지막 문자인 '!'를 가리키고 있었습니다.

 

'!' 문자와 0x33을 xor 연산하고 ecx를 1감소시키는 작업을 ecx가 0이 될 때까지 반복합니다.

 

 

모든 문자에 대해서 xor 연산이 끝나고 출력하려는 문자열을 확인해보니 해석할 수 없는 문자열로 난독화가 완료되었음을 확인할 수 있습니다.

 

이번 시간에는 xor 명령어를 사용하여 간단한 난독화 프로그램을 만들어보았습니다.

 

x86은 이번 시간을 마지막으로 공부를 종료할 것이고, 다음 시간부터는 arm 아키텍처에 대해서 공부를 시작하도록 하겠습니다!

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함