y0u_bat

[Hand-Ray] 1. C언어 기초 핸드레이 본문

System

[Hand-Ray] 1. C언어 기초 핸드레이

유뱃 2015. 8. 5. 01:20


 [Hand-Ray] 1. C언어 기초 





간단한 c언어 코드를 짜서 컴파일 하고 gdb로 어셈으로 보겠습니다.






sub esp,0x20 // esp의 0x20만큼 공간 확보

mov DWORD PTR [esp+0x18],0xa // [esp+0x18] 공간에 0xa(10) 넣기  c코드로는 int a = 10;

mov DWORD PTR [esp+0x1c],0x14 // [esp+1c] 공간에 0x14 넣기 c코드로는 int b = 20;  


여기서 왜 변수 시작이 esp+0x18부터냐?

- 컴파일러 마다 다름(컴파일러 마음임)


call add 위에 mov는 add의 인자값이나 그런게 들어있습니다.


mov eax,DWORD PTR [esp+0x1c]  // 두번째 인자 [esp+0x1c] -> 0x14

mov DWORD PTR [esp+0x4],eax

mov eax,DWORD PTR [esp+0x18] // 첫번째 인자 [esp+0x18] -> 0xa

mov DWORD PTR [esp],eax

call 0x804845c <add>



add 함수 부분을 한번 보면,
sub esp,0x10 // esp의 0x10만큼 공간확보
mov eax,DWORD PTR [ebp+0xc] // 두번째 인자를 eax에 저장
mov edx,DWORD PTR [ebp+0x8]  // 첫번째 인자를 edx에 저장

*eax, ebx, ecx, edx는 어셈블리어에서 값을 넣고 뺏는 변수라고 생각하면 된다.

add eax,edx // eax랑  edx 랑 더합니다 eax = eax+edx 랑 같습니다 c코드로는 a+b
mov DWORD PTR [ebp-0x4],eax // eax를 ebp-0x4에 넣습니다.
mov eax,DWORD PTR [ebp-0x4] // 다시 그 ebp-0x4를  eax에 넣습니다.

*보통 함수가 실행하면 리턴값은 eax에 들어간다.
여기서 말하는 eax는 add의 리턴값입니다.

mov DWORD PTR [esp+0x4],eax 
->  현재eax에는 add의 리턴값이 있습니다, 이것을 printf의 첫번째 인자값에 넣어줍니다.

mov DWORD PTR [esp],0x8048510
-> 0x8048510은 printf("여기내용",인자);에서 "" 내용입니다.

call 0x80482f0 <printf@plt>






직접 한번보면 %d가 있는걸 보실 수 있습니다.



그래서 최종적으로 핸드레이해서 나온 c코드


#include <stdio.h>


int main()

{

int v1 = 10;

int v2 = 20;

printf("%d\n",add(v1,v2));


}


int add(int v1,int v2)

{

return v1+v2;

}


입니다.


변수의 이름은 우리가 어셈블리를 보고 직접 알 수 없기 때문에,

임의로 v1 v2로 해놓았습니다.



'System' 카테고리의 다른 글

hand-ray 연습5  (0) 2015.08.19
hand-ray 연습4  (0) 2015.08.19
hand-ray 연습3  (0) 2015.08.19
hand-ray 연습2  (0) 2015.08.19
hand-ray 연습1  (0) 2015.08.19
Comments