2023. 9. 16. 16:51ㆍ포너블
오늘은 Plaid CTF대회에서 출제된 ropasaurusrex 문제를 풀이하고자 한다.
함수의 프롤로그를 보면 다음과 같다. 'WIN'이라는 문자열이 출력되는 것을 확인할 수 있다.
메인함수에서 sub_80483F4()함수가 호출되고 'WIN'이 write된다.
sub_80483F4()함수에서는 136개의 공간을 가지고 있는 buf 변수가 존재한다. buf의 크기가 136인데 read함수에서 0x100만큼 입력받아서 buffer overflow 취약점이 발생하게 된다. 이러한 bof취약점을 활용해서 페이로드를 구성하고자 한다.
read@got 주소를 릭해서 libc_Base 주소를 구하고자 한다. read@got는 위 빨간 박스의 값과 같다.
ropgadget를 확인해보면 다음과 같다. 이때 pop3ret가젯이 필요하다. 이 이유는 페이로드에 이용할 read, write함수의 인자가 3개이기 때문이다.
먼저 write_plt, write_got 값을 gdb 디버거를 이용해서 구해준다. 이후 ropgadget으로 pppr, pr가젯을 구해주고 objdump로 bss영역을 구해준다. 이후 binsh 값을 구해준다. 이후 a * 0x88로 buf크기를 채위주고 bbbb만큼 sfp를 채워주고 write_plt로 write_got를 출력해준다. 이후 메인으로 다시 돌아가서 leak한 주소를 받고 이것을 통해 libc_base를 구해준다. 이를 통해 system 함수도 구해주고 pr 가젯을 통해 system('/bin/sh')를 실행시켜준다.
페이로드는 동작하면 정상적으로 쉘을 획득하는 것을 확인할 수 있다.
'포너블' 카테고리의 다른 글
format string bug 32bit (0) | 2023.09.30 |
---|---|
Dreamhack - oneshot (0) | 2023.09.24 |
Dreamhack - basic_rop_x64 (0) | 2023.09.23 |
Dreamhack - basic_rop_x86 (0) | 2023.09.16 |
[dreamhack] basic_exploitation_000 (0) | 2023.09.04 |