본문 바로가기

dis & asm

main 분석 (1)

gcc 버전은 4.24
gcc버전마다 어셈코드가 조금씩 다를수 있다.


int main()
{
    return 0;
}

요걸 디스어셈해봣다 ..

gcc -g -o main main.c
objdump -S main > main.txt
vi main.txt

뭔지 모를 어셈코드가 암호화 해서 나온다 (머리가..ㅡㅡ)
일단 main 코드 위치에서 부터 보자


08048344 <main>:
int main()
{
 8048344:   8d 4c 24 04             lea    0x4(%esp),%ecx
 8048348:   83 e4 f0                and    $0xfffffff0,%esp
 804834b:   ff 71 fc                pushl  -0x4(%ecx)
 804834e:   55                      push   %ebp
 804834f:   89 e5                   mov    %esp,%ebp
 8048351:   51                      push   %ecx
    return 0;
 8048352:   b8 00 00 00 00          mov    $0x0,%eax
}
 8048357:   59                      pop    %ecx
 8048358:   5d                      pop    %ebp
 8048359:   8d 61 fc                lea    -0x4(%ecx),%esp
 804835c:   c3                      ret

오호 c언어에서는 아무것도 아무일도 안하는게
뭔 어셈코드가 이리도 많어..


8048344:   8d 4c 24 04             lea    0x4(%esp),%ecx

간단히 보는 방법
3가지 패턴으로 나누어진다
8048344

8d 4c 24 04            

lea    0x4(%esp),%ecx

첫번째 8048344  요건 16진수로 메모리 주소값이다
정확하게 말하면 코드가 저장되어 있는 메모리 주소값이다
저도 초보이니 말하는게 쉽지 않네

음 그니까 우리가 c언어 배울때 메모리 구조에 대해 배웠을 것이다.

아마도 스택, 힙, 데이타 간단히 이정도

스택은 보통 지역변수가 들어가는 메모리고
힙은 동적할당
데이타는 전역변수나, 스태틱변수가 들어가고

이것도 잘 모른다면 당분간 c책을 다시 보기를 .....

여기서 좀더 세분화 하면 코드도 메모리 상에 올라가야 한다
왜 ?
당연하다 코드가 메모리에 올라가야지 그걸 해석해서 실행해야 될거 아니야
여기서 말한 코드는 c언어 소스코드를 말한게 아니다
지금은 이미 코드를 컴파일하고 바이너리된 코드이다

즉 2진수화된 코드를 말하는거다
8048344 <--- 이건 코드의 주소값이다
그럼 2진수화된 코드는 어디있는걸까?

8d 4c 24 04  <-- 요거다 16진수로 바꾼거다
왜 16진수로 바꿔서 보냐느 사람은 2진수로 바꿔서 보시길 바란다

그럼 저 코드는 도대체 무슨일을 하는걸까?
그것도 나왓다

lea    0x4(%esp),%ecx <-- 어셈코드이다

즉  8d 4c 24 04  ---------->  lea    0x4(%esp),%ecx
1 :1 매칭이 되는거다


8048344:   8d 4c 24 04             lea    0x4(%esp),%ecx

<결론>
8048344 메모리 주소에는  8d 4c 24 04 기계어 코드가 있고
기계어코드를 어셈블리로 표현하면 lea    0x4(%esp),%ecx  나온다


정리가 잘 됐는지 모르것다
오늘은 일단 간단히 보는 방법만...ㅡㅡ
사실 지금 이 글을 쓴게 맞게 쓰는건지도 모르것다