반응형 pwnable.kr18 pwnable.kr [Toddler's Bottle]->[random] [random] key(사용자 입력값) ^ random = 0xdeadbeef 가 되면 풀린다. 중요한건 random 시드가 없다. 그렇다면 random값이 고정되어 있을듯하다. xor 연산은 A xor B = C 일때 A xor C = B 이다. 그러므로 random ^ 0xdeadbeef = key(사용자가 입력해야할 값) 이 된다. rbp -0x4 에 위치한다. rand의 값은 0x6b8b4567이다. 입력해야할 키 값은 3039230856이다. 2021. 8. 11. pwnable.kr [Toddler's Bottle]->[passcode] [passcode] 코드를 보면 main -> welcom -> login 순으로 흘러간다. welcome에서 name[100]에서 입력받은 값을 출력하고 login()에서 2개의 값을 입력받아 출력하는데 scanf()를 보면 변수에 &연산자가 없다. 또한 fflush(stdin);가 있다. scanf()의 인자에 &가 없으면 받은 인자를 주소로 인식한다. 96바이트 뒤에 주소를 덮어 씌울수 있다. 그렇다면 원하는 곳의 4바이트를 입력할 수 있다. 또한 fflush의 got(exit())를 오버라이팅시키고 system(“/bin/cat flag”)로 점프하면된다. 우선 exit주소를 보면 0x0804a018이다. 그리고 system(“/bin/cat flag”)주소를 보면 0x080485e3이다. 페이로.. 2021. 8. 11. pwnable.kr [Toddler's Bottle]->[flag] [flag] flag파일을 다운받는다. 우선 hex값을 보면 ELF파일에 UPX로 패킹 되어있는걸 확인할 수 있다. 우선 언패킹을 해준다. flag가 rdx에 있다. b *main+39 해주고 rdx를 보면 2021. 8. 11. pwnable.kr [Toddler's Bottle]->[bof] [bof] bof문제이다. func에 넣은 인자 deadbeef를 를 오버플로우를 통해 cafebabe로 바꿔주면 된다. gdb로 확인해보자. 스택의 구조를 대략 살펴보면 0xdeadbeef ret sfp ? overflow ? 로 있을것이다. main +29 에서 ebp-0x2c (44)로 입력받은 인자를 저장하는 것을 알 수 있다. 그렇다면 0xdeadbeef ret4 sfp4 dummy12 overflow32 로 스택 구조를 알 수 있다. payload를 짜보면 52byte + cafebabe 이다. 2021. 8. 11. pwnable.kr [Toddler's Bottle]->[collision] [collision] 소스코드를 보면 20바이트의 argv[1]을 주고 인자의 값과 hashcode(0x21DD09EC)를 맞게 하면 풀리는 문제이다. 여기서 check_password(){}함수에서 argv[1]을 가지고 장난을 친다. argv[1]을 5번 더한 값을 반환해주는 함수이다. 인자를 포인터로 받아와서 4바이트 단위로 계산한다. for문에서 5번 더하므로 hashcode / 5의 값을 넣어 주면 되는데 계산해보니 마지막에 4를 더해줘야한다. 0x6c5cec8 (113626824[16]) 4번과 0x6c5cecc 1번을 넣어주면 된다. 2021. 8. 11. pwnable.kr [Toddler's Bottle]->[fd] [fd] ssh fd@pwnable.kr -p2222 fd에 setuid가 걸려있고 실행권한이 부여되어있다. fd.c파일을 확인하면 다음과 같다. read(“파일디스크립터”, “버퍼”, “버퍼의 크기”) 인데 여기서 fd가 0 = stdin 1= stdout 2 = stderr 이다. 그럼으로 fd 가 0이되어야 입력값을 받을 수 있다. fd는 atoi( argv[1])-0x1234로 정의 되는데, atoi는 10진수 정수 문자열을 정수로 리턴한다. 그러므로 argv[1] - 0x1234의 값이 0 이되면된다. 0x1234(16) = 4660(10) 2021. 8. 11. 이전 1 2 3 다음 반응형