Profile

머리정리하는곳

c2w2m2

[Level13] darknight -> bugbear 다른풀이

FC3의 Level 2 를 풀다가보니 힌트가 ret sled 가 주어져서 이게 뭔가.... 하고 찾아보니 ret에 ret 주소를 쓰고 또 ret에 ret 주소를 써서 스택 주소 입력제한(?) 같은것을 우회하는 기법이라 합니다. 이를 보고 어디서 연습해보지.... 했는데 LOB RedHat RTL1 번이 ret에 스택 주소를 못걸게 되있는 구조로 되어있길래 이를 우회해서 0xbf?????? 모양의 주소를 넣어 쉘을 실행시켜 보겠습니다! 코드는 생략하고 ret 주소를 찾아 보겠습니다 찾을거도 없이 그냥 disas main 하면 나와영... 환경변수에 shellcode 넣고 그 주소를 찾는건 생략 할게여 계획을 세워 보자면 dummy + sfp [44 byte] + ret에 ret주소[4 byte] + 환경변..

Pwnable/LOB ·

[Level1] gate -> iron_golem

먼저 RedHat 이랑 비교해서 FC3에서 달라진점 Stack Dummy 추가Random StackASCII ArㅡorNON-Executable StackNON-Executable Heap Stack Dummy 추가는 변수들과 SFP, RET 사이에 필요없는 dummy 공간들이 채워진다는 거고Random Stack은 스택주소가 실행마다 랜덤하게 바뀌어서 shellcode를 넣어도 제대로된 주소로 못주는것ASCII Armor 은 라이브러리 함수 최상위 주소값이 0x00으로 고정되서 연속적 함수 호출 불가NON-* 은 각각에서의 실행권한을 없애는 것 즉 RedHat에 비해 겁나게 어려워요... 일단은 알고 넘어가고 Level1 소스코드부터 보죠 코드 자체는 매우 매우 쉽네요하지만 NON- 때문에 shellc..

Pwnable/LOB ·

[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 ·