y0u_bat
[Hand-Ray] 1. C언어 기초 핸드레이 본문
[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