1포인트 짜리 mistake 문제입니다. 힌트는 연산자 우선순위 입니다. 여기는 fd가 0보다 작으면 끝내버리는 부분이고, 여긴 pw_buf2 배열을 선언하고 입력 받은 후 xor 하는 부분입니다. 여기가 이제 pw_buf랑 pw_buf2를 비교해서 같으면 flag를 출력하는 부분입니다. 여기가 xor 해주는 부분인데, XORKEY가 1 이므로 넘겨받은 인자를 1 xor 함을 알 수 있습니다. 이제 대충 어떤 프로그램인지 알았으니 어디가 취약한지 보겠습니다. 이 부분들을 보면 fd에 open과 read의 반환값을 넣고 그걸 0과 비교하려고 한 것이지만, 연산자 우선순위가 비교 연산자(>,
블랙잭 게임인데요,,nc pwnable.kr 9090 으로 접속하면 게임을 할 수 있습니다. 소스코드도 주는데, 친구가 "그거 그냥 베팅할 때 검사 안해서 터지는거임" 이라고 해서 좀 찾아봤더니 이 부분에 보니까 얼마 베팅할 지 입력받고, 현재 잔액보다 크면 다시 한번 입력받네여 근데 여기서 다시 입력 받을 때는 검사를 안하네요 그래서 10000 이렇게 줬는데 안되길래 음수로 한번 줘봤더니 잔액이 올라갔네요! 그런데 뭐 아무일도 없길래 다시 한번 음수로 줘봤습니다 오 이번엔 성공적으로 flag가 출력되네요! 소스코드가 아스키아트가 많아 건너뛸 수 있는게 많아서 좋았네요 ㅋㅋ 소스코드 읽기 귀찮다 으으
소스 코드인데, key입력받고, rand()로 나온 값을 xor연산해서 0xdeadbeef이면 flag를 출력합니다. srand()가 아닌 rand()는 시드값을 주지 않으면 난수값이 고정되게 됩니다. 그러므로 고정적인 random값을 찾을 수 있다는 말이죠 저기 scanf로 rbp - 0x8의 값을 eax 레지스터로 주고, 이 값을 rbp - 0x4의 값과 xor 하는걸 보니 rbp - 0x4. 여기에 random의 값이 있겠네요 그래서 bp걸고 찾아봤는데 고정적인 난수값은 0x6b8b4567였습니다 그러면 이제 우리가 key ^ 0x6b8b4567 = 0xdeadbeef 가 되게 key값을 넣어줘야 합니다 key랑 0xdeadbeef 자리를 바꿔서 0xdeadbeef ^ 0x6b8b4567 을 해봤는..
flag라는 64bit 바이너리 파일 하나를 줍니다. IDA로 보니깐막 이상하게 있길래 String을 봤는데 upx라고 써 있어서 구글링을 좀 해봤는데, 실행파일을 압축/해제 하는 패커라고 합니다. 그러면 upx로 언패킹을 하면 패킹이 되지 않은 원본파일을 볼 수 있겠네요 -d 옵션이 decompress, 즉 언패킹하는 옵션이기 때문에 upx -d flag 이렇게 하면 Unpacked 1 file 이렇게 뜨는 것을 볼 수 있네요 그러면 다시 IDA로 언패킹된 이 파일을 보겠습니다 Shift+F12 옵션을 이용해서 String을 봤더니 역시 flag가 있네요!
12345678910111213141516171819#include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); }}int main(int argc, char* argv[]){ func(0xdeadbeef); return 0;} Colored by Color Scriptercs bof.c 의 소스코드 입니다. main에서 func로 0xdeadbeef를 넘겨주는데 func에서는 overflowme라는 char형 배열에 ge..
col.c의 코드인데, main의 파라미터로 받은 argv[1]의 값을 check_password라는 함수에 넘겨줘서 그 값을 res라는 변수에 5번 나눠 담은 후에 main에 return해서 main에서 hashcode의 값과 비교를 해서 같으면 flag를 출력해줍니다. ip에 있는 값을 5번 나눠서 res 변수에 담는 것이므로 res를 5번 나눠보았습니다. 6c5cec8라는 값이 나와서 이걸 5번 대입하면 될 줄 알고 대입해봤는데,, wrong passcode라고 뜨네요,, 다시 찾아봤는데 6c5cec8을 5번 더하면 21dd09ec가 되지 않고 21dd09c8이 되네요. 그러면 6c5cec8을 4번 더하고 6c5cec8보다 4byte 큰 6c5cec8을 더해주면 21dd09ec로 res값이 맞춰지겠..
ssh fd@pwnable.kr-p2222 여기로 접속해보겠습니다. fd.c파일을 보겠습니다. read함수로 buf에 값을 읽어와서 그 내용이 LETMEWIN이면 플래그를 출력합니다. 우리는 argv[1]로 fd를 조작할 수 있습니다. fd란 파일을 관리하기위해 OS가 가지고있는 파일의 정보를 가지고 있는 것. 입니다. fd 가 0이면 표준입력(stdin) 1이면 표준출력(stdout) 2이면 표준에러(stderr) 그렇다면 fd를 0으로 만들어주는 값을 argv[1]에다가 넣고, buf에 LETMEWIN이라는 문자열을 받으면 되겠네요. 와아