
깔끔한 bof!

코드도 상당히 깔끔합니다!
0xdeadbeef가 func()에 전달되고
overflowme배열에 gets()로 입력을 받아 이걸로 key변수를 bof해서
0xcafebabe로 덮어씌워서 /bin/sh을 실행시키라는 것 같습니다.

gdb로 대략적인 흐름을 봐줍시다.
사실 위에 코드를 보고 메모리 구조를 머리로 그려준뒤 차이가 있는지 정도만 봐주시면 됩니다.
bp를 걸기전에 aslr에 맞추어서 한번 실행시켜서 주소를 갱신해줍시다.
bp를 func에 걸어주고 실행해줍니다.


그 후 40행쯤 CMP에 bp를 걸고 스택을 한번 살펴봅시다.

입력으로는 a를 4개 주었습니다.
cmp가 실행되는 ebp+0x8주소가 key의 주소공간으로 예상됩니다.

예상되로 key의 값인 deadbeef가 들어있네요
우리가 넣어준 aaaa값을 스택에서 찾아봅시다.

ebp 전후로 100워드 정도 봐줍시다.
첫줄의 두번째 세번째 워드의 6161이 보이시나요?
첫번째 워드의 시작주소가 $ebp-50 두번째 워드가 $ebp-46입니다.
이때 반워드는 제가 넣은 값이 아니기에 $ebp-44가 aaaa가 담긴 overflowme의 시작주소이겠네요

정확하네요
그러면 몇 글자를 덮어씌어야 될까요?
$ebp+0x8 - $ebp-44이므로 52바이트가 필요합니다.

52개의 a를 입력한뒤 다시 스택을 보니 deadbeef의 바로 앞까지 정상적으로 입력되었습니다!
어라? 근데 deadbeef의 마지막 ef가 짤렸네요? 이건 입력하며 마지막 eol이 입력되어서 그렇습니다.
즉 52바이트에 쓸데없는 정보(패딩)를 넣어주고 0xcafebabe를 입력해주면 원하는대로 /bin/sh이 실행 될것 같습니다!

예상대로 잘 돌아갑니다! 참고로 cafebabe는 리틀엔디안으로 바꿔서 넣어줍시다.

서버에서도 정상적으로 돌아갑니다!
Clear!
음 근데 서버 상태가 안좋은지 flag가 나오기 전에 끊기는 경우가 꽤 있네요...
'wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr]flag 풀이 (0) | 2021.06.11 |
---|---|
[pwnable.kr] collision 풀이 (0) | 2021.06.11 |
[pwnable.kr]fd 풀이 (0) | 2021.06.11 |