2024. 2. 25. 16:02ㆍInformation Security 정보보안/Reverse Engineering 리버스 엔지니어링
배울내용:
어셈블리 코드 분석
assembly code 분석
레지스터
레지스터 사칙연산
Register
EAX, EDX, ECX, ESI
어셈블리어 명령어
Reversing Engineering
리버싱 엔지니어링 기초
이전시간 : Assembly 명령어 (레지스터 Register) 2
https://sarimus.tistory.com/88
Reverse Engineering DAY_005 레지스터, OllyDBG 레지스터 , Register, 범용 레지스터, 인덱스 레지스터, 포
배울내용: 레지스터 OllyDBG 레지스터 Register 범용 레지스터 인덱스 레지스터 포인터 레지스터 어셈블리어 명령어 OllyDBG 레지스터 이해 OllyDBG 실습 Reversing Engineering 리버싱 엔지니어링 기초 배울내
sarimus.tistory.com
이번시간: 실제 코드 어셈블리로 분석하기
이번엔 여태까지 풀어본것을 한번 실습해보는 시간이다
이것으로 인해 나오는 EAX 값을 구해보자
딱봐도 금방 구해질것이다
아래에는 어떤 프로그램이 실행되었는지 C 언어로 작성되어있는 코드가있다
내려가기전에 먼저 어떤코드인지 예측해보고 내려보자
정답은
a 에 5 를 , b 에 6 을 넣은걸 c 에다가 더해주고 그 C 를 출력하는 코드였다
이것도 한번 풀어보자
한번 예측해보고 notepad 에다가 적고 아래의 정답과 비교해보자
a 에다가 5 를 b 에다가 6 을 그리고 a x b 를 한걸 C 에 넣고 그걸 출력하는게 정답이다
그리고 오늘 마지막 문제다
이걸 풀면 이제 어느정도 어셈블리 코드를 볼수있다고 판단하고 OllyDBG로 분석을 할수있을것이다
이코드에서
ESI, ECX , DEX , EAX 값을 순서대로 구하라
<+0>: push rbp
<+1>: mov rbp,rsp
<+4>: sub rsp,0x10
<+8>: mov DWORD PTR [rbp-0x4],0x16
<+15>: mov DWORD PTR [rbp-0x8],0x5
<+22>: mov edx,DWORD PTR [rbp-0x4]
<+25>: mov eax,DWORD PTR [rbp-0x8]
<+25>: add eax,edx eax 27
<+28>: mov DWORD PTR [rbp-0xc],
<+22>: mov eax,DWORD PTR [rbp-0x4]
<+22>: sub eax,DWORD PTR [rbp-0x8]
<+22>: mov DWORD PTR [rbp-0x10],eax
<+22>: mov esi,DWORD PTR [rbp-0x10]
<+22>: mov ecx, DWORD PTR [rbp-0xc]
<+22>: mov edx, DWORD PTR [rbp-0x8]
<+22>: mov eax, DWORD PTR [rbp-0x4]
<+34>: mov r8d,esi
<+34>: mov esi,eax
<+36>: lea rax,[rip+0xe89] # 0x2004
<+43>: mov rdi,rax
<+46>: mov eax,0x0
<+51>: call 0x1030 <printf@plt>
<+56>: mov eax,0x0
<+61>: leave
<+62>: ret
해석은 이렇게 된다
만약에 틀렸다면 실행순서를 잘보고 내가 혹시 10진수와 16 진수(HEX) 를 헷갈리진 않았나 다시 확인해보길바란다.
ESI, ECX , DEX , EAX
은 17,27,5,22 가 된다
아래는 실행된 코드다
여기서 한가지 봐야할것은
코드를 출력할떄는 abcd 순으로 22 5 27 17 인데 어셈블리에서는 ESI, ECX , DEX , EAX 은 17,27,5,22 가 된다
따라서 코드에서는 "abcd" 순으로 값이 출력되지만, 어셈블리어에서는 메모리에 저장되는 순서에 따라 변수의 순서가 달라지는 것이기 떄문에 어셈블리에서는 저렇게 보이게된다.
이러한 구조는 우리가 항상공부했던 Stack 구조란걸 알수있다
예를 들어, 어셈블리어에서 변수를 스택에 저장하는 경우, 변수가 역순으로 스택에 쌓일 수 있다.
그리고 FILO(First In Last Out) , LIFO(Last In First Out) 의 개념이 이때 적용이 된걸 알수있다.
다음시간에는 사칙연산이 아닌 조건문을 실행했을때 어셈블리 코드에서는 어떻게 보이는지
그리고 어떻게 찾는지를 공부할거다.