본문 바로가기

Wargame

(56)
[pwnable.kr] unlink 12345678910111213141516171819202122232425262728293031323334353637383940414243#include #include #include typedef struct tagOBJ{ struct tagOBJ* fd; struct tagOBJ* bk; char buf[8];}OBJ; void shell(){ system("/bin/sh");} void unlink(OBJ* P){ OBJ* BK; OBJ* FD; BK=P->bk; FD=P->fd; FD->bk=BK; BK->fd=FD;}int main(int argc, char* argv[]){ malloc(1024); OBJ* A = (OBJ*)malloc(sizeof(OBJ)); OBJ* B = (OBJ*)m..
[pwnable.kr] unexploitable Pwnable.kr unexploitable 해당 문제의 Main을 보면 굉장히 간단합니다.그냥 ROP문제인가 하고 가젯을 살펴봤습니다. READ 함수에서 0x50F 만큼 입력을 받는데 syscall 의 OPCODE가 0F 05 이기 때문에 syscall 함수를 이용할 수 있습니다.하지만 leak을 할 수가 없어서 고민을 많이 했습니다. Main 모습을 보면서 payload를 생각해봤는데 [rbp+buf] 를 이용해 공격을 할 수 있었습니다.Rbp에 넣을 주소는 bss를 활용하여 공격에 사용하였습니다. 시나리오1.rbp 즉 read를 통해 입력당할 주소를 bss로 바꾸기.Ret에 read_ret(lea rax, [rbp+buf] address) 를 덮고 sfp 자리에 bss+0x10 의 주소를 덮었습니다..
[pwnable.kr] Dragon Pwnable.kr Dragon 해당 문제에서 봐야할 부분은 아래 코드들 입니다. 해당 프로그램은 용과 싸워서 이기는 게임입니다드래곤, 전사 의 data를 0x10만큼 malloc 해주면서 사용하고 있는데 해당 데이터를 쓰고 free할 때 초기화 해주지 않고 성공문에서 malloc(0x10)를 똑같이 해주기 때문에 uaf 취약점이 발생합니다.일단 성공문으로 가려면 드래곤과 싸워 이겨야 합니다.드래곤은 엄마 용, 전사는 성직자 일 때 피를 깎아 이길 순 없지만 엄마용의 HP는 127를 넘어가게 되면 인티저 오버플로우가 일어나기 때문에 무적기와 마나 회복으로 버티면 이기게 됩니다. System(“/bin/sh”) address = 0x8048DBFfrom pwn import * #p = process('./..
[pwnable.kr] simple login Pwnable.kr Simple Login Main을 보면 먼저 입력을 받고 base64 디코딩한 문자열 크기를 v6 변수에 저장한 후에 memcpy(&input, B64DecodeStr, len(B64DecodeStr)) 이런식으로 옮기게 됩니다. Auth 함수를 봤을 때 memcpy에서 취약점이 터지게 됩니다. 만약 저희가 12크기의 문자열을 넣는다면 sfp를 변조시킬 수 있습니다. 또한 auth 함수를 나가고 바로 leave ret 으로 가기 때문에 주소가 변하지 않는 input 전역변수 주소를 sfp에 넣고 전역변수 + 4 지점에 메인 ret에서 리턴할 주소를 Correct 문으로 넣는 다면 쉘을 딸 수 있습니다. 0x8049278 = Correct address 0x811eb40 = Global..
[xcz.kr] chaos 보호되어 있는 글입니다.
[Suninatas] system 27 위 내용이 문제내용이다. 서로 주고받은 비밀 문자열이라고 하는데 사실상 문제제목 자체가 hint다. 위 내용을 hxd에 옮기고 hex값만 추출하여 ollydbg에서 아무파일이나 열고 binary paste 하면 아래와 같이 디스어셈 된다. eax 레지스터를 이용해서 값을 넣고 스택에 입력하는데 중간중간에 아무 의미없는 어셈명령어가 많아서 처음엔 조금 해맸지만 쭉 트레이싱 해서 스택값을 확인해보니 key가 존재하였다. 맨 처음엔 이게 왜 system종류지 하고 생각했는데 되게 색달라서 좋았던거같다.
[pwnable.kr] passcode 12345678910111213141516171819202122232425262728293031323334353637383940414243#include #include void login(){ int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); printf("checking...\n"); if(passcode1==338150 && passcode2==13371337){ ..
[pwnable.tw] start 문제의 디스어셈 모습이다 system call을 하는거 같은데 read의 syscall 번호는 4 write는 3이다.1은 아마 exit였고 2는 fork? 였다.write의 인자를 보면 20만큼 출력하는데 스택을 ecx에 옮긴 후 인자로 사용한다. gdb로 스택을 분석한 모습(read에 a*8 넣은상태)인데 함수가 끝나기 직전으로 가 스택에 상황을 살펴보면 아래와 같다.push esp - 0xffffce10 push offset _exit - 0x804809d push 3A465443h - CTF: push 20656874h - the\x20 push 20747261h - art\x20 push 74732073h - s\x20st push 2774654Ch - Let'이렇게 스택에 할당이 되있는데 re..