마지막으로 write함수를 호출하면 3에서 했던 과정에 의해 write가 아니라 system이 호출.
Payload는 로직대로 짠 다음 payload를 보내면 1의 과정때문에 read_got의 주소가 출력 → 주소를 받아서 leak_base의 주소를 구한다음 → binsh를 입력하여 2의 과정에 bss영역에 binsh 저장 → 그 다음 system의 함수 주소를 입력하여 3의 과정에서 write_got를 system함수의 주소로 변경 → system(bss)가 되여 system(/bin/sh)가 되서 쉘을 딸 수 있다.
ROP
https://libc.blukat.me/ ← 이쪽 사이트에서 프로그램이 사용하는 실제 라이브러리가 어떤것인지 알수 있다.
_IO_fgets b90
__libc_system 4e0 을 하면 libc6_2.27-3ubuntu1.2_amd64이 라이브러리가 나오고 현재 Unexploitable1은 이 라이브러리를 사용한다는 것을 알 수 있다.
취약점은 배열의 크기는 char 16byte 이지만 fgets를 통해 0x64byte를 입력받으니 bufferoverflow가 발생함을 알 수 있다(64bit)
또한 Partial RELRO때문에 GOT Overwrite이 가능하다.
Persudocode
ROP 로직
Payload는 로직대로 짠 다음 payload를 보내면 1의 과정때문에 read_got의 주소가 출력 → 주소를 받아서 leak_base의 주소를 구한다음 → binsh를 입력하여 2의 과정에 bss영역에 binsh 저장 → 그 다음 system의 함수 주소를 입력하여 3의 과정에서 write_got를 system함수의 주소로 변경 → system(bss)가 되여 system(/bin/sh)가 되서 쉘을 딸 수 있다.
Exploit Code
'HackCTF' 카테고리의 다른 글