2017-12-11 1 views
-2

나는 내 학교의 보안 프로젝트를하고있다.GDB disass main

이 프로젝트의 경우 바이너리가 있으며,이 바이너리의 의사 코드를 만들고 익스플로잇을 수행해야합니다.

더 잘하려면 ASM 나는 정확히 같은 소스 코드를 c에서 처리하려고합니다. 나는 edx에 문제가있다.

0x080484a5 <+41>: mov edx,0x8048468 

이 전체의 주요 코드 :

Dump of assembler code for function main: 
0x0804847c <+0>: push ebp 
0x0804847d <+1>: mov ebp,esp 
0x0804847f <+3>: and esp,0xfffffff0 
0x08048482 <+6>: sub esp,0x20 
0x08048485 <+9>: mov DWORD PTR [esp],0x40 
0x0804848c <+16>: call 0x8048350 <[email protected]> 
0x08048491 <+21>: mov DWORD PTR [esp+0x1c],eax 
0x08048495 <+25>: mov DWORD PTR [esp],0x4 
0x0804849c <+32>: call 0x8048350 <[email protected]> 
0x080484a1 <+37>: mov DWORD PTR [esp+0x18],eax 
0x080484a5 <+41>: mov edx,0x8048468 
0x080484aa <+46>: mov eax,DWORD PTR [esp+0x18] 
0x080484ae <+50>: mov DWORD PTR [eax],edx 
0x080484b0 <+52>: mov eax,DWORD PTR [ebp+0xc] 
0x080484b3 <+55>: add eax,0x4 
0x080484b6 <+58>: mov eax,DWORD PTR [eax] 
0x080484b8 <+60>: mov edx,eax 
0x080484ba <+62>: mov eax,DWORD PTR [esp+0x1c] 
0x080484be <+66>: mov DWORD PTR [esp+0x4],edx 
0x080484c2 <+70>: mov DWORD PTR [esp],eax 
0x080484c5 <+73>: call 0x8048340 <[email protected]> 
0x080484ca <+78>: mov eax,DWORD PTR [esp+0x18] 
0x080484ce <+82>: mov eax,DWORD PTR [eax] 
0x080484d0 <+84>: call eax 
0x080484d2 <+86>: leave 
0x080484d3 <+87>: ret 

당신이 나를 찾는 데 도움이 될 수있는 방법 41 + 메인 라인 :)하십시오을 수행하는 나는 방법 C에서이 작업을 수행하는 더 IDEE이 없다?

답변

1

0x8048468 아마 수에 따라 포인터 값 주셔서 감사합니다. 어쩌면 함수 포인터 일 수도 있습니다. 이는 위의 페이지에 있기 때문에 0x8048350 (malloc의 PLT 항목)입니다. 하지만 정적 버퍼 (아마도 문자열 리터럴과 같은 읽기 전용 버퍼)에 대한 포인터 일 수 있습니다.

아마도 void *edx = "hello world"; 또는 void *edx = &some_function입니다. 그런 다음 어떻게 든 사용하십시오. C 문은 단일 asm 명령에 매핑되지 않지만 최적화되지 않은 출력 (gcc -O0)으로 인해 각 C 문은 메모리의 모든 값으로 완료되는 연속적인 명령 블록에 매핑됩니다. (즉, 디버거를 사용하여 C 변수를 수정하고 최적화되지 않은 코드에서 "작동"하도록 할 수 있습니다.)

최적화되지 않은 코드처럼 보이는 저장소/다시로드의 흔적을 추적하지 않았습니다. mov-immediate 이후에 다음 명령어에서 메모리에 저장된 후 그 값으로 정확히 무엇이 완료되고 있는지 확신 할 수 없습니다. 컴파일러의 ASM 출력에서 ​​

봐 당신은 소스가있는 경우 (gcc -S 대신에 모든 방법을 컴파일 바이너리 다음 disassemblign), 또는이있는 경우 그 값을 재배치 정보를 얻을 수 objdump -drwC -Mintel를 사용합니다. 또는 nm을 사용하여 기호 표에서 찾으십시오.

함수 포인터 인 경우 해당 주소의 디스 어셈블리가 의미가 있어야합니다.

+0

0x8048468은 함수 yes의 포인터입니다. 나는이 리눅스 배포본에 nm이 없다. –