본문 바로가기

dis & asm

(11)
nasm 메뉴얼
disasmble 기초 정리 (2) 눈이 너무 피곤하네여~ 밖에 잠깐 나갔다 왔는데 벌써 벚꽃이 피었습니다. 흠... 근데 난 집에 짱박혀서 뭐 하는 건지... ㅋㅋ 전 문서에서 계속 이어 갑니다.. 80483e4: 55 push %ebp 80483e5: 89 e5 mov %esp,%ebp 80483e7: 51 push %ecx 80483e8: 83 ec 24 sub $0x24,%esp int a, b; int result; 80483e7: 51 push %ecx ecx 레지스터를 스택에 넣었습니다. 이게 뭘까여? gdb 로 확인해 보면 (gdb) x $ecx 0xbfdbf2b0: 0x00000001
disasmble 기초 정리 (1) 예전 글을 보니 역시 나도 보면서 정리가 깔끔하지 못했습니다. 다시 정리해서 글을 올려봅니다. !! 저도 초보라서 틀릴수 있습니다. 고수분들 중에 문서에 틀린부분이 있으면 지적해 주세요 !! 예제) int sum(int a, int b) { int sum; sum=a+b; return sum; } int main() { int a, b; int result; a=10; b=5; result=sum(a, b); printf("result = %d\n", result); return 0; } 간단한 프로그램 입니다. 이걸 disasmble 해 보겠습니다. 저 같은 경우는 disasmble 할때 objdump 를 이용하여 파일을 추출한걸 열고 gdb로 디버깅하여 서로 비교해 가면서 합니다. gcc -g -o ..
어셈 분석 (변수) #include int main() { char a[]="abc"; char *b="def"; a[0]='q'; b[0]='q'; return 0; } c언어 책에 한번쯤 나와본 예제입니다. 프로그램을 실행하면 리눅스에서 Segmentation fault 에러 납니다. 이말은 곧 메모리를 잘못 참조하였는 말인데 b[0]='q'
함수 분석 (2) 이번엔 함수에 인자값을 넘겨주는 프로그램이다 08048344 : void func(int a, int b) { 8048344: 55 push %ebp 8048345: 89 e5 mov %esp,%ebp 8048347: 83 ec 10 sub $0x10,%esp int c; c=a; 804834a: 8b 45 08 mov 0x8(%ebp),%eax 804834d: 89 45 fc mov %eax,-0x4(%ebp) } 8048350: c9 leave 8048351: c3 ret 08048352 : int main() { 8048352: 8d 4c 24 04 lea 0x4(%esp),%ecx 8048356: 83 e4 f0 and $0xfffffff0,%esp 8048359: ff 71 fc pushl -0..
함수 분석 (1) 함수가 어떤 방법으로 실행이 되는지 확인해봅니다 일단 코드 void func() { } int main() { func(); return 0; } 디스어셈 하면.... 08048344 : void func() { } 8048344: 55 push %ebp 8048345: 89 e5 mov %esp,%ebp 8048347: 5d pop %ebp 8048348: c3 ret 08048349 : int main() { 8048349: 8d 4c 24 04 lea 0x4(%esp),%ecx 804834d: 83 e4 f0 and $0xfffffff0,%esp 8048350: ff 71 fc pushl -0x4(%ecx) 8048353: 55 push %ebp 8048354: 89 e5 mov %esp,%ebp ..
main 분석 (3) gcc 3.22 지금 pc방이라서 집에 쓰는 gcc가 다르네요 보니까 약간의 어셈코드가 다른데 큰 차이는 없습니다. 포인터가 어셈에서 어떻게 쓰이는지 보겠습니다. 먼저 disasm 입니다. 80482f4: 55 push %ebp 80482f5: 89 e5 mov %esp,%ebp 80482f7: 83 ec 18 sub $0x18,%esp 80482fa: 83 e4 f0 and $0xfffffff0,%esp 80482fd: b8 00 00 00 00 mov $0x0,%eax 8048302: 29 c4 sub %eax,%esp int a; int b; int *p; a=10; 8048304: c7 45 fc 0a 00 00 00 movl $0xa,0xfffffffc(%ebp) b=20; 804830b: c7..
main 분석 (2) 어제 알바뛰고 낮에 자서 새벽까지 눈이 탱글탱글하다..ㅋㅋ 어셈 코드만 보고 해석하기 힘들다 gdb로 브레이크 걸면서 레지 변화를 주목하면서 따라가면 그나마 이해하기 쉽다 main에서 변수하나를 선언했다. 08048344 : 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 8048352: 83 ec 10 sub $0x10,%esp int i; i=10; 8048355: c7 45 f8 0a 00 00..