Wargame, CTF/protostar (15) 썸네일형 리스트형 heap2 구조체 auth에 32바이트 name과 auth가 있음 실행 후에 fgets로 입력을 받고 'auth '면 auth이후에 값을 auth->name에 저장 'reset'이면 free(auth) 'service'면 service이후의 문자를 저장 'login'이면 auth->auth의 값이 0이아니면통과 0이면 불통 문제가 좀 애매함 UAF(Use After Free)취약점을 원하는 것 같은데 auth를 malloc할 때 auth구조체 만큼 동적할당 하는 것이 아니고 4바이트만 할당해서 딱히 free를 안해도 클리어 됨 일단 UAF는 동적할당을 한뒤에 free()를 하면 메모리에서 사라지는 것이 아님 free를 하고 같은 크기의 동적할당을 하면 free된 메모리를 씀 auth 1234로 구조체를 동적할당으로.. heap1 malloc이 4번있고 strcpy가 두 번있음 더블strcpy를 이용해서 winner를 샐행시켜야함 인자를 2개 주어야함 첫 malloc이후 bp를 걸어 동적 할당된 메모리 주소를 찾음 인자로 aaaa bbbb를 준고 run 2번째 strcpy가 실행된 이후 heap의 상태를 확인 4개의 malloc이후 정상적으로 aaaa와 bbbb가 삽입됨 앞의 코드에서 name은 포인터 변수이기 때문에 aaaa와 bbbb는 빨간 동그라미의 주소에 들어간 것을 알 수 있음 첫번째 인자다음 i2->name의 주소까지 20바이트 그래서 첫번째 인자로 20바이트를 채운다음 3번째로 동적할당 받은 i2->name의 주소를 printf의 got로 바꿔서 두번째 인자를 winner의 주소를 주면 두번째 strcpy로 인해 pr.. heap0 heap overflow를 이용해 winner()를 실행시키면 pass 그림처럼 malloc으로 128바이트를 동적할당 할 시 앞에 type과 size가 8바이트를 차지하고 밑의 data가 동적할당한 크기만큼 생성이되며 더 밑에 footer가 붙을 수도 있음 일단 첫 malloc과 2번째 malloc으로 할당된 메모리의 주소 d와 f가 가진 주소를 찾음 이 주소는 위의 heap의 구조 그림에서 type의 시작번지가 아닌 data의 시작번지를 반환해서 eax에 넘겨줌 main+21, 37에 bp를 걸어주고 AAAA를 인자로 주고 run d의 data주소는0x804a1a0 f의 data시작 주소는 0x804a1f0 strcpy가 동작한 후인 main+107부분에 bp를 걸고 d의 data주소-0x8 (typ.. format4 FSB를 이용해 exit()가 아닌 hello함수가 실행되게함 exit의 got를 hello의 got로 변조 시키면 exit가 아닌 hello를 실행 가능 이전 문제처럼 3부분으로 나누어서 넣음 08/484/b4 b4먼저 vuln의 exit를 call하는 부분에 브레이크 포인트 걸어두고 gdb 에서도 파일을 인자로 줄 수 있음 b4가 들어감 다음 484 484도 잘 들어감 마지막 08 hello의 주소를 다 넣음 continue해보면 format3 target의 값을 0x01025544로 만들면 pass AAAA는 12번째 'AAAA'+target의 주소를 넣고 13번째에는 %n을 넣어 변조 target의 값이 68로 바뀜 이전 문제처럼 0x01025544를 바로 넣어도 되고 3부분으로 나누어서 01/0255/44 이렇게 넣어줘도됨 3부분으로 나누어 넣어줄 땐 밑줄친 부분 AAAA, BBBB, CCCC 다음이 01/ 0255/ 44 가 들어갈 주소임 target의 주소+1,2,4 이렇게 3부분으로 넣음 4부분으로 나누어서 넣는 것도 가능 44를 넣어주어야 하는데 이미 70임 데이터를 빼줄수는 없기 때문에 144가 되게함 0x144 - 0x70 = 212 212+8 144가 되어도 다음 255를 넣을때 1이 255에 덮혀지기 때문에 상관 없음 14C.. format2 target의 값을 64로 만들면 pass AAAA가 4번째에 위치하니까 AAAA+(target의 주소)해서 5번째(target의 주소)에 값을 씌어주면 됨 target의 주소가 잘 들어감 AAAA 4바이트 target의 주소 4바이트 %8x*4 = 8*4->32바이트 40바이트로 target에 64를 넣어야하니 64 - 40 = 24 56이 나오는데 %x는 기본 8자리로 나오니까 24에 8을 더해주어야함 32 format1 %x153번해서 딱 맞춰서 나왔고 151번째에 있으니까 41414141 -> 151번째 target의 주소 -> 152번째에 오게 해서 target의 값을 변조 시키면 됨 152번째에 target의 주소가 잘 들어감 target의 값이 0만 아니면 되기 때문에 마지막 152번째 %x를 %n으로 바꿔주어 target의 주소에 값을 써준다 target변조 성공 stack7 6번이랑 별 달라진게 없지만 ret가 갈 주소를 검사하는 부분이 더 엄격해졌다 이젠 6번 처럼 ret에 system함수의 주소를 삽입하는 것도 불가능해 보인다 system의 위치가0xf로 시작하기 때문에 f &(and) b 연산으로 하면 b가나와서 걸리기 때문 이럴 때는 이런식으로 getpath의 ret을 main의 ret주소를 넣어주면 ret를 검사하는 부분에 걸리지 않고 그밑에 system과 /bin/sh로 채울 수 있다 (main문엔 ret를 검사하는 부분도 없고) 이러한 방식을 ROP(Return Oriented Programming)이라고 함 이제 구해야 할 것 buffer에서 ret(getpath)까지의 길이 main의 ret주소 system 주소 /bin/sh 주소 buffer에서 ret까지.. 이전 1 2 다음