basic_exploitation_000

2026. 5. 17. 01:08·Write-up/DreamHack

서버는 32비트 인텔 아키텍처를 사용하고, 리틀 엔디언이다. 

어떤 프로그램인지 실행부터 해보려고 했는데, 실행에 필요한 파일이 없다?고 떠서 코드부터 확인해보았다.

30초 타임아웃이 존재한다.

main 함수를 보면 128바이트의 버퍼를 정의했는데, scanf에서 141바이트 만큼 문자열을 받는다. 

버퍼 오버플로우 취약점이 존재하는 것을 확인했다. 

 

버퍼의 위치 확인을 위해서 disass 로 main을 까보자

buf가 ebp-0x80에 위치한 것을 확인했다.

어셈블리를 배운지 얼마 안되어서 다 이해할 순 없었는데, scanf()를 콜하는 부분 직전이 들어갈 인자를 스택에 push하는 부분으로 이해했기 때문에 ebp-0x80이 버퍼의 위치라고 생각했다. 

*디버그 화면에서 x/s 0x8048699 처럼 입력하면 문자열을 확인할 수 있다. 

프로그램을 실행하고싶어서 조금 찾아봤다.

아래의 명령어로 32비트 프로그램을 64비트 리눅스에서 돌아가도록 할 수 있다. 

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libstdc++6:i386

buf = (%p) 에서 %p에는 버퍼의 주소가 대입된다.

실행할 때 마다 바뀌는데, 프로그램이 메모리에 적재될 때 마다 위치가 달라져서 그런듯하다. 

 

32비트 아키텍처이므로 SFP와 RET(Retrun Address)는 각각 4바이트씩이다. 

아래와 같은 구조가 되는데, buf에 shellcode와 dummy데이터를 입력하고, SFP는 더미 데이터 (안돌아가도 상관없으니까), RET에 버퍼 주를 덮어씌우면 흐름을 조작할 수 있을 것 같다. 

쉘코드는 메모리에서 별도의 작업 없이 바로 실행이 되도록 하기 위해서 사용?한다. 

execve 쉘코드를 작성해본다. 

//bin/bash는 /bin/bash 와 같아서 4바이트를 채워주려고 /를 하나 더 입력해주었다. 

 

컴파일 해주기

\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x0b\xcd\x80

 

스크립트는 아래와 같이 짜준다. 

recvuntil로 메모리 주소 앞의 문자를 모두 먹어주고, 이후 ')' 가 나오기 전까지 받은 데이터를 buf 변수에 저장한다.

drop 옵션은 ')'를 포함할지 말지 정하는데, True로 설정하면 해당 문자열은 포함되지 않고 버려진다.

이렇게 얻은 주소를 16진수 int로 변환해주었다. 

 

p32로 버퍼를 4비트로 패킹해준다. 

연결이 안되는 ? 되는 ? 된건지 잘 모르겠다...

저 $는 쉘을 얻은게 아니라 그냥 interactive() 였던건가?

 

다시 코드로 돌아와보았다. 

'scanf' 로 받고 있다. 

 

scanf는 문자열의 끝을 공백 문자로 인식하는데, 이에 해당하는 x09, x0a, x0b, x0c, x0d, x20이 쉘코드에 존재하면 안된다.

보안 기초 수업때 교수님이 정말 신나하시면서 설명해주셔서 갑자기 기억이 났다. ㅎ...

쉘코드를 다시 확인해본다. mov 부분에 x0b가 있다.
쉘코드에 x0b가 존재해서 scanf에 들어갈 때 끊겨서 그런 것 같다.

 

어떻게 해결할까 고민을 하다가 

al에 0x8을 담은 후 inc eax을 3번 사용해줬다. 참고로 al은 eax의 하위 8비트(1바이트)이다. 

쉘코드를 다시 얻었고 \x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80

 

이제 스크립트를 수정해서 실행하면 플래그를 얻을 수 있다.

 

저작자표시 비영리 변경금지 (새창열림)

'Write-up > DreamHack' 카테고리의 다른 글

Return to Shellcode  (0) 2026.05.18
basic_exploitation_001  (0) 2026.05.17
Return Address Overwrite  (0) 2026.05.16
shell_basic  (0) 2026.05.13
addtion-quiz, flag-shop  (0) 2026.05.12
'Write-up/DreamHack' 카테고리의 다른 글
  • Return to Shellcode
  • basic_exploitation_001
  • Return Address Overwrite
  • shell_basic
권 한
권 한
포렌식 같이 하실래요?
  • 권 한
    Kwon5an.log
    권 한
    • 분류 전체보기 (115) N
      • @Xpert (28)
        • 2025 (23)
        • 2026 (5)
      • Forensic (26)
        • Windows (7)
        • Linux (3)
        • Memory (4)
        • Network (0)
      • System Hacking (6)
      • Reversing (0)
      • STUDY (11)
        • 컴퓨터 구조 (2)
        • 운영체제 (0)
        • 알고리즘 자료구조 (0)
        • CS (7)
      • #컴공에서살아남기 (15) N
        • 201 C++ (3)
        • 201 보안기초 (12) N
        • 201 OSS (0)
      • Write-up (15)
        • H4CKING GAME (1)
        • DreamHack (12)
        • bandit (0)
      • PROGRAM (0)
        • K-shield.jr (0)
      • PROJECT (0)
      • 사담.생각.끄적끄적 (7)
  • 공지사항

    • Notice
  • 링크

    • DAILY BLOG
    • Velog
    • NOTION
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.6
권 한
basic_exploitation_000
상단으로

티스토리툴바