

코드를 보면 read 함수를 통해 입력을 받고 write 함수를 통해 입력 받은 데이터를 출력하는 걸 알 수 있다.
버퍼의 크기는 0x44이지만 read 함수로는 0x400만큼 입력 받을 수 있기 때문에 bof 터트릴 수 있다.

쉘을 따기 위해서는 system 함수를 호출해야 하는데, system 함수의 주소를 알 수 없으므로 system 함수의 주소를 구해야 함
# read_addr leak
72바이트의 문자를 채우고 ret을 write함수의 주소로 덮음
이때 write 함수의 인자는 3개이기 때문에 다음과 같이 차례대로 적어줌
① 인자를 정리를 정리 해줄 pppr 가젯
② write 함수의 인자
▶ write(1, read_got, 4) : read함수의 주소 출력
# input "/bin/sh" → bss
system 함수의 인자인 "/bin/sh\x00"를 bss 영역에 적어주어야 함.
① 다시 read 함수를 호출
② pppr 가젯
③ read 함수 인자
3-1 : 0
3-2 : bss 시작 주소 + 0x100 → bss 시작 주소에서 0x100a만큼 떨어진 곳에 입력 받은 데이터를 넣음.
3-3 : len("/bin/sh\x00") → "/bin/sh\x00"의 길이 만큼 입력을 받음
▶ read(0, bss + 0x100, len(binsh))
payload를 보내기 전에는 libc_base의 주소를 알 수 없기 때문에 system 함수의 주소를 구할 수 없음 → payload를 나눠서 보내야 함.
payload를 보내고, libc_base를 구한 다음,
libc_base주소와 system 함수의 offset을 더해 system 함수의 주소를 구함
(32bit - 라이브러리 시작 주소 '\xf7')

# main
system 함수의 주소를 구한 다음, bof를 터트리기 위해 다시 main을 호출함.
① read 함수로 입력을 받으니까 72바이트의 문자를 채워준 후,
② ret을 system 함수의 주소로 덮음.
③ system 함수 이후에 호출할 함수가 없으므로 "BBBB" 4바이트의 문자를 넣어주고,
④ system 함수 인자 "/bin/sh"의 주소를 적어줌

'Layer7' 카테고리의 다른 글
| rop32 (0) | 2021.08.03 |
|---|---|
| FSB1 (0) | 2021.08.02 |
| HackCTF : RTL64_1 (0) | 2021.07.18 |
| HackCTF : RTL32_1 (0) | 2021.07.17 |
| HackCTF : RTL_World (0) | 2021.07.16 |