문제는 32bit로 pie와 canary가 꺼져있다
문제 코드
입력은 read로 받고 printf로 buf를 한번에 출력하니 fsb를 일으킬 수 있다
get_shell의 주소로 exit_got 값을 덮으면 exit를 실행할때 get_shell을 실행할 것이다
got overwrite방법을 사용하는게 plt를 실행할때 got유무를 확인하고 got가 있으면
got를 실행하는게 아닌가 해서 이렇게 해봤다.
문제 풀이 과정
1. 디버깅
2. get_shell 주소 구하기
3. payload 작성
4. 실행
1. 디버깅
사실 처음 문제풀때 ret가 없어서 %c사이에 공백으로 bof하려고 했는데 아쉬웠다
마지막 부분에 exit plt를 실행시킨다
2. 주소 구하기
0x8048609
이 주소로 덮을 것이다
3. payload 작성
우선 get_shell 주소를 그대로 %c안에 넣어서 시도하면 값이 너무 크기 떄문에
반으로 나눠서 해줬다
exit got 는 총 4byte이기 떄문에 2바이트 씩 넣어줄 것이다
32bit이기 때문에 exit에 먼저 값이 들어가게 exit + 2를 먼저 넣어줬다
앞에 넣은 값이 p32에 들어갔기 때문에 각 4바이트씩이다 그래서 총 8바이트가 앞에 먼저 들어갔다
따라서 2052를 넣지 않고 2052 - 8 = 2044를 넣어준다 두번째 주소도 동일하게 넣어준다
이때 %hn을 꼭 사용해야하는데 2byte씩 보내려 하는 것이기때문에 short방식으로 넣어야해서
%hn을 꼭꼭 사용해야한다.
4. 실행
풀이 실패 과정
1. 32bit에서 주소가 4byte라는거 잊지말자
2. p32안에 들어가면 4바이트 p64에 들어가면 8바이트로 나온다
이를 생각하지 않고 exit주소를 넣을때 2바이트씩 나눠 넣어진줄 알았다.
3. %n을 사용할때 2byte를 넣어줘야 할 때 꼭 %hn을 사용해 short 2byte 형식으로 만들어 줘야한다
'시스템해킹' 카테고리의 다른 글
[드림핵] uaf_overwrite 풀이 (0) | 2024.06.25 |
---|---|
[드림핵] basic_exploitation_003 풀이 (0) | 2024.05.27 |
[드림핵] Format String Bug 풀이 (0) | 2024.05.27 |
[드림핵] out_of_bound 풀이 (0) | 2024.05.20 |
[드림핵] hook 풀이 (0) | 2024.05.19 |