2023. 9. 16. 20:50ㆍ포너블
이번 시간에는 전 포스터에서 올렸던 32bit rop문제를 복습할겸 가져왔다.
문제 설명은 위에 같다. 취약점을 찾아서 익스플로잇해서 플래그를 구하는 과정을 설명하겠다.
이 소스코드에서는 buf값을 0x40으로 정의하고 있는데 read함수에서 0x400만큼을 읽음으로써 버퍼 오버플로우라는 취약점이 발생게된다. 이 버퍼오버플로우 취약점을 악용해서 익스를 하고자 한다. 이때 라이브러리의 베이스 주소를 구해서 프로그램 간의 주소를 맞춰줘야한다. 때문에 read함수의 got 부분이 필요하다.
먼저 plt 부분의 주소는 0x80483f0인 것을 확인할 수 있다. 이 부분을 좀 더 자세히 들여다 보겠다.
조금 더 자세히 보면 0x804a00c인 것을 확인할 수 있고 여기가 read함수의 got라는 것을 확인할 수 있다.
그리고 buf부터 $esp 값의 차이는 0x48임으로 이 다음으로 오는 게 ret주소가 되겠다.
페이로드 구성에 필요한 가젯들을 하나씩 모으면 위 사진과 같게 된다. 이때 write_plt는 read_got를 출력하는데 사용되고 pppr가젯은 write함수의 인자 값을 정의해 주는데 사용된다. pr 가젯은 system 함수의 인자 값을 넣어줄 때 사용된다.
'\x90' no opreation code로 0x48만큼의 크기를 채운 뒤에 오는 주소 ret주소를 write_plt로 해주고 write함수에는 인자가 3개 필요함으로 1, read_got, 4(사이즈)를 넣어주게된다. 그리고 뒤에 main함수 다시 리턴해줘서 입력 값을 전달할 수 있는 상태로 만든다.
이후 출력되는 read_got를 저장해주고 이걸 통해 libc_Base주소를 구해준다. 베이스 주소를 구한 뒤 베이스 주소를 각 libc.symbols에 더한다. 이때 /bin/sh도 같이 더해주게 된다. 이후 다시 \x90 no operation code를 0x48만큼 다시 보내주고 system함수와 pr 가젯을 이용해 /bin/sh를 실행시켜준다.
전체적인 페이로드는 위 코드와 같다. 궁금한 사항이 있으면 댓글 남겨주세요!
'포너블' 카테고리의 다른 글
format string bug 32bit (0) | 2023.09.30 |
---|---|
Dreamhack - oneshot (0) | 2023.09.24 |
Dreamhack - basic_rop_x64 (0) | 2023.09.23 |
Plaid CTF ropasaurusrex (0) | 2023.09.16 |
[dreamhack] basic_exploitation_000 (0) | 2023.09.04 |