My Study/System

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
Handray  (0) 2015.03.25
Stack Corruption  (0) 2015.03.18
리틀 엔디안(Little Endian), 빅 엔디안 (Big Endian)  (1) 2015.03.14
메모리 구조  (0) 2014.12.13

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.