목록Wargame/HackCTF (37)
Pwnstar

child heap 문제 풀면서 얻은 지식 덕분에 좀 쉽게 풀 수 있었던 문제였다. 보호기법은 다 걸려있음. 보통 힙 문제에서 Full relro 걸려있으면 malloc hook이나 free hook을 덮어서 익스하게 된다. 흔한 힙 문제들과 같이 malloc, edit, free, print 등을 할 수 있다. int add() { int result; // eax signed int v1; // [rsp+Ch] [rbp-4h] puts(&byte_FF6); result = smooth(&byte_FF6); v1 = result; while ( v1 >= 0 && v1
너무 오랬동안 문제를 안풀어서 오랜만에 워게임 문제도 풀 겸해서 핵시텦 포너블 남은 문제 중 하나를 풀어봤는데, 역시 너무 오랜만에 그것도 힙 문제를 풀어서 그런지 라업 도움을 좀 받았다. 라업 보고 보길 잘했다는 생각이 든게, libc 릭을 할 방법을 도저히 못찾아서 라업을 본거였는데 이거는 한달 잡아도 못풀었을듯 새로운 방법을 알게되서 좋았다. 문제는 상당히 심플하다. 메뉴엔 malloc과 free 딱 두가지만 존재하고, double free bug가 발생하고 fastbin dup 취약점이 터지는 걸 알 수 있다. 요 문제는 상당히 자세히 설명해 놓은 분들이 많아서 자세한 설명이 필요하신 분들은 맨 아래에 적어놓을테니 그 곳에서 보는 것을 추천한다. exploit 시나리오 1. 0x80만큼의 mall..

풍수지리설 핵시텦의 풍수지리설 문제를 풀면서 heap fengshui에 대한 공부를 좀 해 보려고 한다. 우선 3번의 입력을 준다. 그러면 heap의 구조는 이렇게 된다. 몇 번씩 재실행하면서 보기 때문에 heap의 주소가 달라진다. offset 위주로 확인해야 함 이 때 0번 인덱스를 삭제하고, libc 주소를 leak하기 위한 페이로드를 malloc한 상태의 힙이다. payload = 'a'*0x80+p32(0x88)+p32(0x11)+'A'*8+p32(0)+p32(0x89)+p32(e.got['puts']) 자 그럼 여기서 생각을 좀 해보자 원래 입력을 받을 때에는 다음과 같이 name을 입력받는 사이즈보다 text를 입력받는 사이즈가 더 크면 종료가 된다. 그런데 어째서 새로 입력을 받을 때 분명..

예전에 라업을 작성했던것 같은데 없다...? 아무튼 다시 풀어보자 보호기법은 NX bit만 걸려있다. IDA로 함 까보자. int __cdecl main(int argc, const char **argv, const char **envp) { setvbuf(stdout, 0, 2, 0); return vuln(); } 요래 생겼다. vuln 함수도 까보자 int vuln() { char nptr; // [esp+1Ch] [ebp-2Ch] int v2; // [esp+3Ch] [ebp-Ch] printf("How many bytes do you want me to read? "); get_n(&nptr, 4); v2 = atoi(&nptr); if ( v2 > 32 ) return printf("No! T..

언익스 3번 문제이다. 이전에 babyfsb 문제가 있는데 이 문제는 도저히 감이 안잡혀서 라업을 보고 공부했다. 이후 혼자서 한번 더 풀어보고 라업을 작성할 생각이다. 하...언익스 3번도 풀고 나니 rtc로 푸는 문제라는 것을 알게 되었다. 참 삽질 많이 했는데...뭐 어찌됐든 언인텐으로 풀었지만 이런 방법도 있다라는 것을 기록하기 위해 써 보려고 한다. 언익스 문제는 갈수록 가젯이 부족해지는 것 같다. IDA int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [rsp+0h] [rbp-10h] setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stdin, 0LL, 2, 0LL); fwrite("..

이 문제는 look at me 문제처럼 statically linked된 문제이다. 아마 got overwrite가 불가능 할 것처럼 보이고(방법이 있는데 모르는 것일수도) 64비트 바이너리이고 NX bit가 걸려있어서 쉘코드 실행이 불가능하다. IDA로 main 함수가 어떻게 되어있는 지 보자 첫 화면은 이런데 main 함수가 어디있는지 찾을 수가 없었다. 이럴 때에는 바이너리를 한 번 실행해보고 나오는 문자열을 검색해서 나오는 함수를 보면 될 것이다. input name: 이라는 문자열이 나오고 입력을 받고 바로 종료된다. 그러면 이 문자열을 shift + F12로 찾아서 따라가보자 __int64 sub_4009C9() { int v0; // ST0C_4 sub_40FDD0(off_6CA748, 0L..

휴 오늘은 이 문제까지만 라업을 작성해야겠다. HackCTF 문제를 풀면서 참 많은 공부가 됐다. 라업도 그때그때 착실하게 작성했더라면 좋았을텐데 말이지... 아무튼 64비트 바이너리이고, 카나리와 NX bit가 걸려있다. IDA로 메인함수를 한 번 보자. int __cdecl main(int argc, const char **argv, const char **envp) { unsigned int i; // [rsp+8h] [rbp-88h] char s1; // [rsp+Ch] [rbp-84h] char src[64]; // [rsp+10h] [rbp-80h] char dest; // [rsp+50h] [rbp-40h] unsigned __int64 v8; // [rsp+88h] [rbp-8h] v8 =..

register 64비트 바이너리이고, NX bit와 카나리가 걸려있다. IDA int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { alarm(5u); setvbuf(stdout, 0LL, 2, 0LL); build(); } 메인함수이다. 시그널을 전달하기 위한 alarm 함수가 설정되어 있고, 5초가 지나면 시그널 14번이 실행된다. build 함수를 보자 void __noreturn build() { __int64 v0; // [rsp+0h] [rbp-40h] __int64 v1; // [rsp+8h] [rbp-38h] __int64 v2; // [rsp+10h] [rbp-30h] __int64 v3; // [rs..