컴맹에서 컴공 그리고 화이트 해커가 되는 그날까지

pwnable.kr [bof] write up 본문

해킹/System hacking

pwnable.kr [bof] write up

공부하는 뚱이 2024. 9. 16. 14:50
반응형

 

bof와 bof.c 파일을 다운로드하여 준다.

 

bof.c 파일 분석

 

  • 이 코드에서 버퍼 오버플로우가 발생할 수 있는 부분은 gets() 함수입니다. overflowme 배열이 32바이트 크기이지만, 사용자가 32바이트 이상 입력하면 스택에 저장된 다른 변수들(예: key 값)을 덮어쓸 수 있습니다.
  • 만약 key 값을 덮어써서 0xcafebabe로 변경할 수 있다면, system("/bin/sh")가 실행되어 공격자가 쉘을 획득할 수 있습니다.

 

* info functions를 사용해 무슨 함수들이 사용되고 있는지 확인

 

pwndbg는 GDB의 확장 프로그램으로, 시스템 해킹과 취약점 분석에서 매우 유용합니다.

특히, bof.c와 같은 버퍼 오버플로우가 포함된 프로그램을 분석하는 데 pwndbg를 사용하면 많은 이점이 있습니다.

 

func함수에 break를 걸어주고 run을 하여 디버깅을 시작하였다.

 

무슨 말을 하는건지 모르겠지만 별로 중요하지 않다 우리가 봐야 할 부분은 call gets 부분이다.

 

gets 부분에 break를 다시 걸어주고 continue를 입력하면 gets 부분에서 다시 멈추게 된다.

 

그리고 ni (next instruction)을 입력하고 아무거나 입력해 준다. 

나는 'FIND'를 입력해 주었다.

 

그럼 이렇게 'FIND' 가 저장된 위치가 나오게 된다.

 

그리고 여기 이 부분을 보면 

  • 0x5664c654 <func+40> cmp dword ptr [ebp + 8], 0xcafebabe
    • 0x5664c654: 현재 실행 중인 명령어의 메모리 주소입니다.
    • <func+40>: 이 명령어가 func 함수의 시작 위치로부터 40바이트 떨어진 지점에서 실행되고 있음을 나타냅니다.
    • cmp dword ptr [ebp + 8], 0xcafebabe: 이 명령어는 스택의 EBP 레지스터를 기준으로 8바이트 떨어진 위치에 저장된 값과 0xcafebabe를 비교합니다.
      • dword ptr: 4바이트(32비트) 크기의 데이터를 다루고 있음을 나타냅니다.
      • [ebp + 8]: EBP 레지스터를 기준으로 8바이트 떨어진 스택 메모리 주소를 참조합니다.
  • 0xdeadbeef - 0xcafebabe
    • 이 부분은 현재 스택에 저장된 값 0xdeadbeef와 비교 값 0xcafebabe 간의 차이를 나타내는 설명입니다.
    • 실제로 비교 연산을 통해 두 값이 같은지, 다른지에 따라 조건 플래그가 설정됩니다.
  • EFLAGS => 0x202 [ cf pf af zf sf IF df of ]
    • EFLAGS 레지스터의 값은 조건 플래그와 제어 플래그를 포함하고 있습니다.
    • 0x202: 16진수로 표현된 EFLAGS 레지스터의 현재 값입니다.
      • cf (Carry Flag): 연산 중 캐리가 발생했음을 나타냅니다.
      • zf (Zero Flag): 결과가 0일 경우 설정됩니다.
      • 나머지 플래그들은 이 경우에는 영향을 미치지 않거나 설정되지 않았습니다.
    • **[ cf pf af zf sf IF df of ]**는 플래그의 의미를 나타냅니다:
      • cf: 캐리 플래그
      • pf: 패리티 플래그
      • af: 애드 캐리 플래그
      • zf: 제로 플래그
      • sf: 서명 플래그
      • IF: 인터럽트 플래그
      • df: 방향 플래그
      • of: 오버플로우 플래그

전체 의미

  1. cmp 명령어는 스택의 EBP + 8 주소에 저장된 값과 0xcafebabe를 비교합니다.
  2. EFLAGS 레지스터의 ZF(제로 플래그)는 비교 결과가 0일 경우 설정됩니다.
    • 즉, 0xdeadbeef가 0xcafebabe와 동일하지 않다면, ZF 플래그는 0으로 설정됩니다.
    • ZF가 0일 경우, 두 값이 다르다는 것을 의미합니다.

요약

이 명령어는 func 함수 내에서 EBP + 8 주소의 값과 0xcafebabe를 비교하고, 그 결과를 EFLAGS 레지스터의 플래그로 설정합니다. 0xdeadbeef와 0xcafebabe는 다르기 때문에 제로 플래그(ZF)는 설정되지 않을 것입니다.

 

이 명령어는 스택의 EBP 레지스터를 기준으로 8바이트 떨어진 위치에 저장된 값과 0xcafebabe를 비교하기 때문에 이 떨어진 위치를 우리가 알아야 한다.

 

 

pwndbg에서 x/x $ebp+8 명령을 실행한 결과, 0xffe24520: 0xdeadbeef를 확인한 것은 메모리의 특정 주소에 저장된 값을 보여줍니다. 이를 좀 더 자세히 설명하자면:

설명

  • x/x $ebp+8: 이 명령어는 GDB에서 현재의 스택 프레임에 있는 주소를 읽는 명령어입니다.
    • x는 **"examine"**의 약자로 메모리 내용을 확인하는 명령어입니다.
    • /x는 값을 **16진수(hex)**로 표시하라는 의미입니다.
    • $ebp는 Base Pointer 레지스터를 나타내며, 현재 스택 프레임의 시작 주소를 가리킵니다.
    • +8은 이 주소에서 8바이트 떨어진 곳의 메모리를 읽겠다는 의미입니다.
  • 0xffdc19b0 : 0xdeadbeef:
    • 0xffdc19b0: 현재 Base Pointer(EBP) 레지스터에 8바이트를 더한 메모리 주소입니다.
    • 0xdeadbeef: 해당 주소에 저장된 값입니다.
  • 즉 0xffe24520에 현제 0xdeadbeef가 저장되어 있다.

즉 오버플로우를 발생시키기 위해서는 우리가 앞서 알아봤던 FIND의 주소값에서 0xffdc19b0가 얼마나 떨어져 있는지 확인해 보아야 한다.

0xffdc19b0 - 0xffdc197c = 0x34 따라서 두 주소의 차이는 52 바이트이다.

 

입력받는 값을 52만큼 밀어내기 위해서 다른 값으로 채워야 한다. 

*** (python -c 'print "A" * 52 + "\xbe\xba\xfe\xca"';cat ) | nc pwnable.kr 9000 ***

하지만 여기서 리틀엔디안 방식이므로

ca fe ba be 아니고 be ba fe ca순으로 입력해 주어야 한다.

 

 

하지만 이렇게 python3으로는 실행이 되지 않아서 결국 bof.py파일을 만들어서 그걸 실행하게 되었다..

원인은 나도 잘 모름... 아는 사람 알려주세요...

 

bof.py

 

 

이렇게 실행하면 flag를 찾을 수 있다!

반응형

'해킹 > System hacking' 카테고리의 다른 글

🔍 C 언어 포인터와 메모리 보안: 실전 가이드  (0) 2025.02.19
pwnable.kr [collision] write up  (0) 2023.09.10
pwnable.kr [fd] write up  (0) 2023.09.09