본문 바로가기

Wargame/▷ pwnable.kr

(12)
[pwnable.kr] md5 calculator 보호되어 있는 글입니다.
[pwnable.kr] echo1 보호되어 있는 글입니다.
[pwnable.kr] brain fuck 보호되어 있는 글입니다.
[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..
[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){ ..