목록write-up (28)
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서버에 접속해주자. random파일의 소스코드를 보면 변수 random 변수에 랜덤 값을 넣고 변수 key에 입력을한다. 입력한 key와 random을 xor연산은 하고 0xdeadbeef와 같으면 flag를 볼 수 있다. gdb로 파일을 열어보자. rand()함수가 호출되고 난 다음의 부분에 break point를 걸어주고 값을 확인해보면 random의 값은 0x6b8b4567이다. 0x6b8b4567과 0xdeadbeef가 xor을 하게되면 3039230856이 된다. 0x6b8b4567 ^ 3039230856은 3735028559이다. 3735028559를 hex값으로 출력하면 0xdeadbeef이다. Flag: Mommy, I thought libc random is unpredictable..
ssh서버에 접속해주고 passcode파일의 소스코드를 보자. login() 함수를 보면 변수 passcode1, passcode2가 있다. scanf()함수를 통해 입력을 받는데 일반적으로 scanf()를 사용할때 scanf("%d", &passcode1);형태일것 이다. 하지만 scanf("%d", passcode1); &가 빠져있다. passcode1이라는 변수에 값을 저장하는게 아니라 passcode1이라는 변수 안에 있는 값의 주소에 입력값을 넣는다. scanf()함수를통해 원하는 주소의 값을 입력한다면 passcode를 조작할 수 있다. welcome()함수에서는 name변수에 100byte를 할당한다. scanf()함수로 100byte만큼만 입력을 받는다. 부분을 보면 name변수는 ebp-..
ssh서버에 접속해주자. col파일의 소스코드를 보면 argv[1]이 20byte가 아니면 안되고 hashcode와 check_password(argv[1])의 값이 같아야한다. check_password()함수는 4byte씩 나눠서 받기때문에 hashcode의 값 0x21DD09EC를 5로 나눠주자. hashcode의 값을 5로 나누면 0x6C5CEC8이 나온다 다시 곱하기 5를 해주자. 0x21DD09EC에서 -4된 0x21DD09E8이 나온다. 0x6C6CEC8 + 4의 값 0x6C5CECC를 리틀 엔디언 방식으로 전달해주면 된다. Flag: daddy! I just managed to create a hash collision :) payload ./col $(python -c 'print "\x..
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()함수..
C드라이브의 이름이 CodeEngn 일경우 CodeEngn이 어떤것으로 변경되는지라고 물어본다. C드라이브의 이름을 CodeEngn으로 바꿔주자. 프로그램을 실행했을때의 모습이다. 아무 값이나 넣어주고 Check를 눌러보자. 에러 메세지가 뜬다. 올리디버거로 파일을 열어보면 시리얼값이 일치할때와 일치하지않을때의 문자열이 보인다. CMP EAX, 0부분에 break point를 걸어주고 프로그램을 실행해보자. 입력한 "1234"와 시리얼처럼 보이는 "L2C-5781EqfgEngn4562-ABEX"가 보인다. "EqfgEngn"이 "CodeEngn"과 유사한 점에서 "CodeEngn"이 EqfgEngn"으로 바뀐걸 알 수 있다. 프로그램을 다시 실행하여 "L2C-5781EqfgEngn4562-ABEX"를 입..
언팩하고 시리얼을 찾으라고한다. 정답은 OEP + Serial이다. 파일을 실행시켜보자. 파일을 실행시키고 아무 값이나 넣어주자 Check Serial을 누르면 에러가 뜬다. 파일을 언패킹을 해주자. 올리디버거로 파일을 열어주자 OEP는 00401360이다. 우클릭 -> Search for -> All referenced text strings를 눌려주자. 아까 보았던 에러 메세지가 있다. 더블클릭으로 이동해주자. "AD46DFS547"이라는 문자열이 push되고 밑에 성공했을때 나오는 문자가 있는걸로 봐서 "AD46DFS547"이 시리얼이라고 생각하였다. 시리얼값을 "AD46DFS547"을 넣어주고 Check Serial을 눌러주자. 시리얼은 "AD46DFS547"이다. 맨처음에 구한 OEP와 시리얼을..