checksec으로 확인해보니 보호기법이 전부 걸려있다
전에 했던 got overwrite는 쓰지못한다
문제
문제를 보면 첫번째 read함수에서 buffer overflow를 일으킬 수 있겠고
[2] 를 보면 scanf에서 addr과 value를 입력받는데 27라인에서
addr주소안에 값에 value를 집어넣는다 따라서
addr에 free hook을 집어넣고 value에 system값을 넣는다면 free hook에 system을 덮을 수 있다
그리고 마지막 free(addr)에 addr에 /bin/sh을 넣는다면 flag를 얻을 수 있을 것 같다.
이 문제를 원가젯으로 푼다고 한다면
위에 과정에서 value에 원가젯을 넣는다면 free(execve("/bin/sh")) 이 때문에
따로 마지막에 /bin/sh주소를 넣지 않아도 되겠다.
원가젯 풀이는 뒤에 추가로 붙이겠다.
문제 풀이 과정
1. fho디버깅
2. main stack frame 작성
3. payload작성
4. 결과
5. 원가젯 풀이 추가
1. 디버깅
이는 fho를 start 명령어로 실행시킨 후 backtrace이다.
stack에도 비슷한 값을 볼 수 있다.
main 함수는 libc_start_main + x의 반환주소를 가지고 있다.
libc_start_main이 main을 호출한다는 이야기이다. 때문에 main에 ret부분에 NXLR이 적용된
libc_start_main + x가 있어 libc의 베이스를 구할 수 있다.
(추가)
libc_start_main 주소를 구할 때 리눅스 버전이 달라지면 값이 달라질 수 있다.
때문에 docker를 사용해서 구해야하는데 로컬 pwngdb로 docker에 fho를 디버깅할 수 있다고 들었는데
방법을 못찾아 docker 내에서 디버거를 설치해서 구했다.
혹시 아는분 있으면 말좀 ..
main stack frame을 구하기 위해 disassemble main
2. main stack frame
여기서 addr 과 value를 안구한 이유는 [1]에서 ret값을 구하고
over flow를 안할거기 때문에
3. payload 작성
[1]에서 ret값을 구하고 offset을 알아냈다
10번라인에서 \x00을 추가한 이유는 u64는 8바이트를 변환하기 때문
free hook을 통해 free를 실행하면 system이 실행되고
마지막에 /bin/sh 주소를 넣었기 때문에 flag를 구할 수 있다.
4. 결과
5. 원가젯 풀이
one_gadget ./libc-2.27.so
이 4가지를 다 넣어봐야함
payload
문제파일에서 설명했듯 free hook에 원가젯을 덮어씌운다면
flag를 구할 수 있다.
풀이 실패 과정
1. docker 사용에 매우 큰 어려움이 있었다 특히 docker를 실행하는 과정은 문제가 없지만
pwngdb를 사용하는 과정에 어려움이 있었다
2. 원가젯을 풀이하는 과정에서 4가지중 해당하는 1가지를 찾는 과정에서
contraints를 보고 찾을 수 없다는 것을 몰랐다.
듣기론 하나하나 다 넣어봐야 한다고 했다.
'시스템해킹' 카테고리의 다른 글
[드림핵] hook 풀이 (0) | 2024.05.19 |
---|---|
[드림핵] oneshot 풀이 (0) | 2024.05.19 |
[드림핵] basic_rop_x86 풀이 (0) | 2024.05.13 |
[드림핵] basic_rop_x64 풀이 (0) | 2024.05.10 |
[드림핵] rop 풀이 (0) | 2024.05.07 |