Handray
Handray 란?
어셈블리어에서 C언어로 바꾸는 작업을 말합니다. 핸드레이를 하시면 어셈블리어를 보게되는데 그 어셈블리어를 보고 이 어셈블리어가 어떠한 기능을 하는지 알게됩니다.
간단한 어셈블리어로 실습을 해보겠습니다. 아래는 GDB를 이용하여 실행 파일을 본것입니다.
이 GDB는 intel 방식으로 변환하여 봤습니다. 그리고 intel 방식은 왼쪽이 기준이고 오른쪽이 대입하는 값입니다.
mov 변수1 변수2
이렇게 있으면 변수 1에 변수 2 값을 넣어라 입니다.
메인 9번째인 0x08048432 와 그 아래 0x0804843a 를 보시면 esp+0x1c , 0xa / esp+0x18, 0x14가 보이는데 이 두개는 변수입니다. 그리고 이 변수에 각각 10과 20을 초기화하고 있습니다. 이 변수들을 각각 v1, v2 라고 하겠습니다.
mov DWORD PTR [esp+0x1c] , 0xa
esp+0x1c 에 0xa 값을 넣어라. v1 값
mov DWORD PTR [esp+0x18], 0x14
esp+0x18에 0x14 값을 넣어라. v2 값
그 다음줄을 보면 v2 값을 eax 에 넣고 최종적으로는 esp-0x4 에 넣습니다. 그리고 v1 값을 eax 에 넣고 최종적으로 esp에 넣습니다. 그 뒤에 0x0804841c 라는 곳을 call 합니다. 이 부분이 add 함수라고 표시 되어 있기에 add 함수도 살펴 보겠습니다.
add 함수에서 보이는 건 ebp+0xc 와 ebp+0x8 입니다. 이 두개는 함수의 인자들입니다. 아마 이 두 인자들은 위에서 esp , esp+0x4
에 넣어 둔것을 add 함수를 call 하면서 ebp+0x8 과 ebp+0xc 로 넘겼을 것입니다. 확인해보겠습니다.
eax에 0x14가 들어가있고 edx에 0xa값이 들어가 있습니다. 그리고 ebp+0x8 값과 ebp+0xc 값에도 똑같이 들어가 있습니다. 여기서 한가지를 확실히 알 수 있습니다. 함수 인자들은 ebp+0x8 이상의 값을 가진다는 것입니다.
함수 인자들은 더하여 eax에 넣습니다. 그 뒤에 add 함수를 종료합니다. main 함수로 돌아와서 eax 값을 esp+4에 넣고 esp에 0x08048500 이라는 값을 넣고 print 함수 호출을 합니다. 0x08046500 은 printf 위에 선언 되었으니 문자열일 것으로 생각 됩니다. 확인해 보겠습니다
%d 라는 서식 문자였습니다. 이제 c로 변환하기 위한것을 모두 알았으니 c로 변환해보겠습니다.
#include<stdio.h>
int add(int num1, int num2)
{
return num1+num2;
}
void main() //return 값이 안보임으로 void 형으로 추측
{
int v1=10; //esp+0x1c
int v2=20; //esp+0x18
printf("%d", add(v1,v2)); // add 함수 리턴값을 어딘가에 저장하지 않고 바로 printf 의 인자로 사용되었으니 이렇게 된것으로 추측
}
이렇게 핸드레이가 끝났습니다.
'My Study > System' 카테고리의 다른 글
Calling Conventions(콜링 컨벤션) (0) | 2015.05.18 |
---|---|
레지스터 (0) | 2015.05.13 |
Stack Corruption (0) | 2015.03.18 |
리틀 엔디안(Little Endian), 빅 엔디안 (Big Endian) (1) | 2015.03.14 |
메모리 구조 (0) | 2014.12.13 |