본문 바로가기

Pwnable/pwnable.kr

[pwnable.kr] leg 풀이

https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr


 

그림 1

wget 명령어를 통해 leg.c와 leg.asm 파일을 먼저 다운로드해 주었다.

 

그림 2

cat 명령어를 통해 확인해보았다.

 

 

<leg.c>

<leg.c> 파일

아래의 main 함수를 먼저 보면,

 

Key1()+key2()+key3()을 더한 값을 구해야하는 것 같고, key값을 정수형으로 받고 있다.

 

열심히 찾아보다가 일단 leg.asm 파일도 다운 cat으로 실행시켰더니 자동으로 gdb를 통해 보여준다,,! 어셈블리 파일이니까 당연한 건가,,,?

 

근데 조금 길다.

 

 

<leg.asm>

<leg.asm>파일 #1

맨 위에는 main함수가 먼저 나오는데, 중간이 key1 부분부터 조금 보면, key1을 r4에 저장하고, key2는 r3에 저장해서 둘을 더한 값을 다시 r4에 저장한다.

정리하면 r4 = key1_key2가 되고,

마지막으로 key3을 r3에 저장한 후

R2에 r4와 r3를 더한 값을 저장한다.

결과적으로 r2 = key1+key2+key3가 된다.

<leg.asm> 파일 #2

찾아보니 여기에서 pc라는 개념을 알아야 한다.

프로그램 카운터라고 부르는데, 명령어가 실행될 때, fetch, decode, execute 과정을 거치는데, 여러 명령어를 실행할 때 효율적으로 하기 위해, 돌림노래처럼

Fetch, decode(다른 fetch), execute(다른 decode), …

이렇게 된다고 한다.

 

Pc는 이 중에서 fetch 단계를 거치는 명령어의 주소를 저장하고, a 명령어에서 execute 단계이면, pc는 c 명령어의 fetch 단계(다다음)의 주소를 저장하는 것이다.

 

 

<key1>부터 보면,

R3 = pc

R0 = r3 이므로, r0=pc가 된다.

여기에서 pc 값은, 8cdc에서 다다음 주소인 8ce4가 된다.

Key1 = 8ce4

 

<key2>를 보면,

중간에 r3에 pc값을 저장하고 있다. 여기에서 함정 아닌 함정이 있는데, 아래에서 r3값에 4를 더해주고 있다.

즉, 원래라면 pc값은 8d08인데 거기에 4를 더하니까 8d0c가 되는 것이다.

Key2 = 8d0c

 

<key3>을 보면,

lr이라는 레지스터가 있는데 찾아보니, 다시 돌아와서 실행할 주소를 가리킨다고 하는데, 간단하게 말해서 리턴할 주소를 보관하는 레지스터라고 한다.

위의 main 함수에서 +68인 8d80이라는 값이 lr에 저장되고, r0에 8d80이 저장되는 것을 확인할 수 있다.

Key3 = 8d80

 

이제 해당 값을 다 더해주면

정수형으로 108,400 이라는 값이 나온다

 

(서버 연결이 안돼서 flag 확인을 못함,,,)

'Pwnable > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] lotto 풀이  (0) 2021.08.18
[pwnable.kr] mistake 풀이  (0) 2021.07.29
[pwnable.kr] random 풀이  (0) 2021.07.29
[pwnable.kr] collision 풀이  (0) 2021.07.26
[pwnable.kr] fd 풀이  (0) 2021.07.11