본문으로 바로가기

[pwnable.xyz] misalignment write up

category CTF/pwnable.xyz 2020. 1. 1. 13:48

 

 

pwnable.xyz 4번째 문제 misalignment 이다.

 

실행 해보면 아래와 같다.

Analyze

이 문제에 사용자 정의 함수는 아래와 같다.

 

위 바이너리 파일을 peda-gdb 로 열어 main 함수의 어셈블리어를 보자.

아래 사진은 main 함수의 일부분 이다.

main 함수의 일부분 (1)

위 어셈블리어 코드를 pseudo 코드로 나타내면 아래와 같다.

6번째 줄에서 Arbitrary overwrite 가 가능한 취약점이 존재하는 것을 볼 수 있다.

사용자가 입력한 3개의 인자를 잘 조작하면 Arbitrary overwrite가 가능하다.

pseudo code

 

아래 어셈블리어는 main 함수의 일부분 이다.

rax에 &((rbp-0xa0) + 0xf ) 주소를 넣고

rdx에 rax 주소의 값을 넣는다.

rdx 와 0xb000000b5 비교하여 같으면 win 함수를 실행하는 구조이다.

main 함수의 일부분 (2)

 

 

 

그렇다면, Arbitrary overwrite 취약점으로 (rbp-0xa0) + 0xf 주소에 있는 값을 0xb000000b5 으로 overwrite 한다면 문제가 풀리게 된다.

 

 

(rbp-0xa0) + 0xf 이 주소를 알기 위해 main+242에 breakpoint를 걸고 실행해준다.

RAX에 0x7fffffffe4df 라는 주소가 저장되어 있다. 이것이 (rbp-0xa0) + 0xf의 주소이다.

(이 주소에는 0xdeadbeef 라는 값이 저장되어 있다.)

(rbp-0xa0) + 0xf 주소

 

 

 

위에서 봤던 pseudo 코드에서 4번째 줄 rbp+rax*8-0x98 이 값이 0x7fffffffe4df 가 되면 된다.

이때의 rbp 값은 디버깅으로 0x7fffffffe570 으로 확인했다.

즉,

0x7fffffffe570 + rax*8 - 0x98 = 0x7fffffffe4df

식이 성립하려면 rax 값이 10진수로 22.875 이어야 한다. 

실수형이 나왔기 때문에 다른 주소를 이용해야 한다.

pseudo code

다른 방법으로는 0x7fffffffe4df 이 주소를 두 부분으로 나누어 값을 overwrite 하면 된다.

0x7fffffffe4d8 이 주소로 접근해보면 아래와 같다.

0xef00000000000000 이 값을 0xb500000000000000 으로 바꾸면 

0x00000000deadbeb5으로 바뀌게 된다. 

 

마찬가지로 0x7fffffffe4e0 이 주소에 접근하면 0x0000000000deadbe 값이 출력이 된다.

이를 0x000000000b000000 로 바꾸면  0xb000000b5 이 값이 완성이 된다.

그럼 각각의 2개 식이 만들어 진다.

0x7fffffffe570  + rax*8 - 0x98 = 0x7fffffffe4d8 

=> rax = 0 (int)

=> 최종 rax = 0 - 0x6 = -6

 

0x7fffffffe570  + rax*8 - 0x98 = 0x7fffffffe4e0 

=> rax = 1

=> 최종 rax = 1 - 0x6 = -5

 

 

이렇게 scanf 함수에서 3번째 인자의 값이 -6과 -5 임을 구했다.

 

rdx는 아래 코드에 의해 각각 0xb500000000000000, 0x000000000b000000이면 된다.

pseudo code

0xb500000000000000 = -5404319552844595200‬

0x0000000000b00000 = 184549376‬

 

따라서 아래의 값을 순서대로 넣으면 된다.

rcx rdx rax
0 -5404319552844595200‬ -6
0 184549376‬ -5

 

 

Payload

from pwn import *

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

p.sendline("0 -5404319552844595200 -6")
p.sendline("0 184549376 -5")
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

댓글을 달아 주세요