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 나온다
정리가 잘 됐는지 모르것다
오늘은 일단 간단히 보는 방법만...ㅡㅡ
사실 지금 이 글을 쓴게 맞게 쓰는건지도 모르것다
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 나온다
정리가 잘 됐는지 모르것다
오늘은 일단 간단히 보는 방법만...ㅡㅡ
사실 지금 이 글을 쓴게 맞게 쓰는건지도 모르것다