스킵했다가 이제야 올리네요;;허허 코드는 음 sfp overwrite 막고, 끝이네여 그 system 내부에 do_system 이라는 함수가 있는데 do_system 에서 execve 를 이용해 shell+인자 구성을 해줍니다. 고로 do_system 에서 execve를 call 하는 부분을 찾아서 이부분으로 eip를 돌리면 명령어 치는대로 실행 될거에요 저기 보이는 저 주소에요 계획은 LOB 1번 보시고 오면 되고 공격 ㄱㄱ(python -c 'print "A"*268 + "\x84\x07\x75\x00"';cat) | nc localhost 7777 Y3S~~! FC3 끝
클리어
코드를 보면 로컬 -> 원격 으로 바뀐거 밖에 안되지만 왠지 모르게 전문제 익스는 안먹더군요 그래서 printf@got 를 바로 덮는거 보다 bbs를 덮고 printf@got를 bbs로 덮기로 했습니다. bbs 는 이렇게 구하는데 저기있는 08049868 이 bbs입니다. 나머지 가젯은 알아서 찾으시고 (귀찮) 계획만 바로 세워보면 dummy[268] + strcpy@plt + ppr + bbs[0] + c0 + strcpy@plt + ppr + bbs[1] + 07 . . . .. . .+ strcpy@plt + ppr + printf@got + bbs + printf@plt + ABCD + /bin/sh 정도가 되고 익스는(python -c 'print "A"*268 + "\x38\x84\x04\x0..
level3 은 일단 스킵 해놓고 이거부터 하죠! 포션 2개를 보면 대놓고 ROP 하라는 것 고로 ROP 를 할것인데 힌트인 GOT Overwrite 를 생각해서 printf의 got 를 system 로 덮어서 하는걸로 필요한건 system , printf@plt, printf@got, strcpy@plt, PPR , /bin/sh정도가 필요합니다. 차례로 구해보면 printf@plt : 0x8048424 printf@got : 0x8049884 strcpy@plt : 0x8048494 system: 0x7507c0 /bin/sh : 0x833603 PPR : 0x804854f 이렇게 구하고 보니 printf@got 를 덮기 위해서 c0, 07, 75, NULL 도 알아야 하네요. 바로 구해봅시다. ob..
문제를 보고 소스를 보고 끝. 원래 환경변수 쓰고 뭐하고 뭐하고 해야되는 문제일텐데 간단하게 이렇게 풀리네요 ... 연속으로 cmd2 ㄱㄱㄱㄱ 문제는 생략하고 바로 코드를 보니 아까 썼던 /bin/cat 이 안데여,,,, 저게 /bin/[command] 안쓰면 cat, bash, ls 같은게 안먹혀요,, /bin/ 없이 쓸수 없는 명령어를 help로 확인해 보니 화질이 별로이긴 한데 한번 쳐보시면 command [-pVv] command [arg ...] 라는게 있습니다. 대충 봐서는 command 를 대신 실행시켜주는 느낌이라 실제로 command -p cat flag 를 해보니 Permission Denied 가 뜨더군요 ? 그럼 /bin/ 없이 cat을 실행시킬수 있나라는 생각에 바로 공격을 해보니..
리버싱 문제네여 파일 다운 ㄱㄱㄱㄱㄱㄱㄱ 그리고 리버싱이니 ida로 까봐여 이건 누가봐도 패킹한것,, 고로 패킹을 풀어야하는데 저가 아는건 upx 밖에 없으니 upx 언패킹 해보져 이렇게 (굳이 리눅스 말고 윈도우도 있어요) 그다음 언패킹 한걸 ida 로 까보면 ㅇㅋ 뭔가 많아졌습니다. 이제 문자열을 한번 찾아봐요. ida에서는 Shift + F12로 확인할수 있어요. 누가봐도 저게 플래그,,,, 클리어!
문제입니다. ssh로 접속해서 코드를 보면 이런식인데 rand 함수는 시드를 주지 않으면 계속 같은 값이 나오게 됩니다. 고로 gdb로 뜯어서 random값만 알면 쉽게 뚫리겠네요. 처음으로 보는 64bit 입니다,,, 처음보고 진짜 고민 많이 했는데 이제는 매우조금 익숙해진,,, 저기 56번줄에 xor연산이 있습니다. eax는 우리가 넣은 key의 값입니다. 그럼 rbp-4 가 random 값이겠네요. 확인 ㄱㄱㄱㄱ 확인 해보면 random 값은 0x6b8b4567 입니다. 그럼 key ^ 0x6b8b4567 = 0xdeadbeef 이니까 처음에는 key를 1~2^32 까지 무차별 대입 하다가 드럽게 안나오길래 다른 방법을 찾아보니 A ^ B = C 일때 B ^ C = A 가 성립한다고 하네요. (신기..
파일 하나하나 받아서 봅시다. func+40 부분이 비교하는 부분이네영 그럼 0x8(%ebp) 가 key 주소값이라 봐도 되겠죠. 그리고 우리가 값을 넣을수 있는 overflowme에 값을 넣는 gets 함수는 func+35번째 줄에 있네요. 그럼 그전줄은 인자를 넣는 부분입니다. mov %eax, (%esp) 면 eax값은 어디서 정해지나? 전줄이겠져뭐 lea -0x2c(%ebp), %eax 에사 -0x2c 가 overflowme의 주소값이겠네요. 그럼 스택 모양의 필요한 부분을 보자면 key 0x8 - (-0x2c) overflowme 같은 모양이 되겠네요 그럼 overflowme 와 key 사이 길이는 0x8 - (-0x2c) 가 되는거고 그 값은 10진수로 52가 됩니다. 굳이 계획을 세워보면 d..
접속 ㄱㄱ read 함수는 무엇일까요?? 형태 ssize_t read (int fd, void *buf, size_t nbytes) 인수 int fd 파일 디스크립터 void *buf 파일 읽어들일 버퍼 size_t nbytes 버퍼의 크기 라는데 저희가 조작 가능한 부분이 fd 죠? 그럼 fd 즉 파일 디스크립터는 무엇일까요???? 정의 : 파일을 관리하기 위해 OS가 필요로 하는 파일의 정보를 가지고 있는 것입니다. 이게 값을 0, 1, 2 를 가지는데 0 : 표준입력 stdin1 : 표준출력 stdout2 : 표준에러 stderr 라고 합니다. 저 문제를 뚫기 위해서는 buf 값이 LETMEWIN이 되야하는데 buf에 원하는 값을 넣기 위해서는 fd가 표준입력이 되면 되겠죠? 0x1234 가 466..